scrollPanel不会仅在图像上显示拇指

时间:2014-06-26 23:28:57

标签: java swing user-interface jscrollbar

我创建了ImageComponent类来显示图像,但是当我从其他类调用它时,scrollPanel不显示拇指,因此我无法向上或向下和向左或向右滚动。它适用于JButton,JTextField。所以我猜测我的ImageComponent类有问题吗?`

class ImageComponent extends JComponent {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Image image;

    public ImageComponent() {
        try {
            image = ImageIO.read(new File(
                    "/Users/Martynas/Downloads/photos/dscf1533.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // paint image
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}
}

这是我初始化并调用ImageComponent类的类:

private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Component component = new ImageComponent();

    JScrollPane scrollPanel = new JScrollPane(component, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    frame.add(scrollPanel);
}

1 个答案:

答案 0 :(得分:3)

任何组件的默认首选大小始终为0x0。滚动窗格将使用此信息来确定如何最佳地显示组件以及是否需要滚动条

ImageComponent课程中,您应该考虑覆盖getPreferredSize方法

@Override
public Dimension getPreferredSize() {  
    return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(this), image.getHeight(this));
}

此外,您的paintComponent方法也不需要公开,任何其他人都不需要打电话。

您还应该将this作为ImageObserver的{​​{1}}参数的参考...

drawImage

对于通过其他方式g.drawImage(image, 0, 0, this); 加载的图像,这一点更为重要,但这是一种很好的做法。

说了这么多,你应该考虑看一下ImageIO,因为它设计用于显示开箱即用的图像。有关详细信息,请查看How to use labels