class ScaleTest {
static void updateImage(JLabel label, int zoom) {
float factor = zoom / 100f;
int imageSize = (int) Math.ceil(100 * factor);
BufferedImage image = new BufferedImage(imageSize, imageSize,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = image.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g.setColor(Color.BLACK);
Font f = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
g.setFont(f);
g.drawRect(0, 0, imageSize - 1, imageSize - 1);
String text = String.format("%d %%", zoom);
LineMetrics metrics = f.getLineMetrics(text, g.getFontRenderContext());
System.out.println(metrics.getAscent() + " at " + factor);
g.scale(factor, factor);
g.drawString(text, 5, metrics.getAscent());
g.dispose();
label.setIcon(new ImageIcon(image));
}
static void createAndShowGUI() {
JLabel imageLabel = new JLabel();
imageLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
JSlider slider = new JSlider(50, 1000, 100);
slider.setMinorTickSpacing(50);
slider.setMajorTickSpacing(100);
slider.setSnapToTicks(true);
Hashtable<Integer, JLabel> labels = new Hashtable<>();
for (int percent = 100; percent <= 1000; percent += 200) {
String text = String.format("%d %%", percent);
labels.put(percent, new JLabel(text));
}
slider.setLabelTable(labels);
slider.setPaintLabels(true);
slider.addChangeListener(e -> updateImage(imageLabel,
slider.getValue()));
JPanel buttons = new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 5));
buttons.add(slider);
updateImage(imageLabel, slider.getValue());
JFrame frame = new JFrame();
frame.add(buttons, BorderLayout.NORTH);
frame.add(new JScrollPane(imageLabel));
frame.setSize(800, 600);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(ScaleTest::createAndShowGUI);
}
}