缩放Graphics2D对象会改变它

时间:2011-11-17 00:34:09

标签: java swing

我有一个JScrollPane,它包含一个带有ImageIcon的自定义JLabel。我希望用户能够放大和缩小图像。我正在尝试使用Graphics2D类中的scale()方法来执行此操作,但每当我进行缩放时,图像都会向下/向上和向右/向左移动,具体取决于我是放大还是缩小。我不知道为什么会发生这种情况或者如何判断我需要translate()图形2D对象来解决这个问题。我非常感谢你们给我的任何帮助。这是我的代码:

class ImageViewer extends JFrame implements ActionListener{
    private int WIDTH = 800;
    private int HEIGHT = 600;
    private JScrollPane scrollPane;
    JMenuItem zoomIn, zoomOut;
    JPanel panel;
    MyLabel label;

    private String imageUrl = "picture.jpg";
    double scale = 1.0;

    public static void main(String[] args) {
        ImageViewer viewer = new ImageViewer();
        viewer.setVisible(true);
    }

    private ImageViewer() {
        this.setTitle("Image Viewer");
        this.setSize(WIDTH, HEIGHT);
        this.setBackground(Color.gray);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        this.getContentPane().add(panel);

        JMenuBar menubar = new JMenuBar();

        JMenu zoom = new JMenu("Zoom");
        zoomIn = new JMenuItem("Zoom In");
        zoom.add(zoomIn);
        zoomIn.addActionListener(this);

        zoomOut = new JMenuItem("Zoom Out");
        zoom.add(zoomOut);
        zoomOut.addActionListener(this);

        menubar.add(zoom);
        this.add(menubar, BorderLayout.NORTH);

        Icon image = new ImageIcon(imageUrl);

        label = new MyLabel(image);
        scrollPane = new JScrollPane();
        scrollPane.getViewport().add(label);
        panel.add(scrollPane, BorderLayout.CENTER);
    }

    public void actionPerformed(ActionEvent e) {
        Object ob = e.getSource();

        if (ob == zoomIn) {
            scale += .1;
            label.revalidate();
            label.repaint();
        }
        if (ob == zoomOut) {
            scale -= .1;
            label.revalidate();
            label.repaint();
        }
    }

    class MyLabel extends JLabel{

        public MyLabel(Icon i){
            super(i);
        }

        protected void paintComponent(Graphics g){
            Graphics2D g2 = (Graphics2D) g;
            AffineTransform at = g2.getTransform();
            g2.scale(scale, scale);
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            super.paintComponent(g2);

            g2.setTransform(at);
        }

        public Dimension getPreferredSize(){
            int w = (int)(scale * getIcon().getIconWidth()),
                h = (int)(scale * getIcon().getIconHeight());
            return new Dimension(w, h);
        }

    }

}

1 个答案:

答案 0 :(得分:4)

g2.scale(scale, scale);添加g2.translate(desiredX, desiredY);之前

相关问题