如何在Swing中调整带有图像缩放的滚动条

3

我希望在图片放大缩小时调整滚动条,我的图片显示在JPanel上,而JScrollPane包含了JPanel。


你的 (放大/缩小) 是如何工作的,可以展示一些代码吗? - oliholz
你想如何进行调整? - dacwe
当图像放大并带有滚动条时,我想要显示整个图像,目前只有部分图像在放大时显示出来。 - NSR
请查看我的程序以更清楚地理解。 - NSR
2个回答

5

针对您更新的问题:

您需要使用新的图像尺寸调用setPreferredSize(测试应用程序时使用此方法)。

zoomINzoomOut中都进行更改:

can.setSize(imgSize);

致:

can.setPreferredSize(imgSize);

示例

当滑块改变时,您需要更新首选大小。我编写了一个小程序(下面是代码),可以生成此屏幕截图(带缩放控件):

screenshot


图像组件代码:

static class ImageComponent extends JComponent {

    final BufferedImage img;

    public ImageComponent(URL url) throws IOException {
        img = ImageIO.read(url);
        setZoom(1);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Dimension dim = getPreferredSize();
        g.drawImage(img, 0, 0, dim.width, dim.height, this);
    }

    private void setZoom(double zoom) {
        int w = (int) (zoom * img.getWidth());
        int h = (int) (zoom * img.getHeight());
        setPreferredSize(new Dimension(w, h));
        revalidate();
        repaint();
    }
}

主程序:

public static void main(String[] args) throws Exception {

    final URL lenna =
        new URL("http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png");

    final JSlider slider = new JSlider(0, 1000, 500);
    final ImageComponent image = new ImageComponent(lenna);
    slider.addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            image.setZoom(2. * slider.getValue() / slider.getMaximum());
        }
    });

    JFrame frame = new JFrame("Test");
    frame.add(slider, BorderLayout.NORTH);

    frame.add(new JScrollPane(image));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 300);
    frame.setVisible(true);
}

1
zoomINzoomOUT 中将 setSize 更改为 setPrefferredSize。请记住,当您调用 pack 时,会更改框架大小,我认为您不想要这个。 - dacwe

1

你应该根据可见图像大小的变化调整JPanel的首选大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接