JPanel上的Java ScrollPane

时间:2014-10-18 12:49:23

标签: java swing user-interface jpanel jscrollpane

我写了JPanel类,我加载了图片。我试图在这个面板上添加一个卷轴,但它没有用。有人能帮我吗?抱歉我的语言不好。

browser.setFileFilter(imgFilter); // ustawienie filtra
browser.setAcceptAllFileFilterUsed(false);
browser.setCurrentDirectory(new File("."));
int result = browser.showOpenDialog(imagePanel);

if (result == JFileChooser.APPROVE_OPTION) {
    // tworzenie obrazu

    imagePanel = new ImagePanel(browser.getSelectedFile());
    JScrollPane scrollPane = new JScrollPane(imagePanel);
    scrollPane.setSize(new Dimension(300, 400));
    //add(imagePanel);
    add(scrollPane);
    //imagePanel.repaint();
    scrollPane.repaint();
}

这是我的imagePanel类:

    private class ImagePanel extends JPanel {
    private Image img;
    private File file;

    public ImagePanel(File file) {
        this.file = file;
        setSize(SCREEN_HEIGHT / 2, SCREEN_WIDTH * 3/4);

        try {
            img = ImageIO.read(file);
        }
        catch(IOException e) {
            System.out.println("Wystąpił błąd podczas wczytywanie obrazu.");
            e.printStackTrace();
        }
    }

    public void paintComponent(Graphics g) {
        if(img == null) return;

        g.drawImage(img, 0, 0, null);
    }
}

1 个答案:

答案 0 :(得分:2)

您应该覆盖getPreferredSize()的{​​{1}},为面板指定首选大小,滚动窗格将使用该大小来确定是否添加滚动。通常,在进行自定义绘制时,您总是希望覆盖绘图画布面板的ImagePanel,因为默认值为0x0

示例:

getPreferredSize

使用getPreferredSize

enter image description here

没有getPreferredSize

enter image description here


<强>更新

我认为你当前的代码有问题。

  1. 要设置图像时创建新的public class Test { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { // image is 256 x 256 Image image = new ImageIcon("stackoverflow.png").getImage(); JPanel imagePanel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image, 0, 0, this); } @Override public Dimension getPreferredSize() { return new Dimension(image.getWidth(this), image.getHeight(this)); } }; JScrollPane pane = new JScrollPane(imagePanel); pane.setPreferredSize(new Dimension(200, 200)); JOptionPane.showMessageDialog(null, pane); } }); } } 。相反,只需在ImagePanel类中使用setImage方法,您就可以在其中设置图像并进行重新绘制。

  2. 在没有ImagePanel的情况下在运行时尝试add(scrollPane);

  3. 请参阅此处的完整示例。

    revalidate()