我创建了 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);
}
最佳答案
任何组件的默认首选大小始终为0x0
。滚动 Pane 将使用此信息来确定如何最好地显示组件以及是否需要滚动条
在您的 ImageComponent
类中,您应该考虑重写 getPreferredSize
方法
@Override
public Dimension getPreferredSize() {
return image == null ? super.getPreferredSize() : new Dimension(image.getWidth(this), image.getHeight(this));
}
此外,您的 paintComponent
方法永远不需要公开,也永远不需要其他任何人调用它。
您还应该将 this
作为对 drawImage
的 ImageObserver
参数的引用传递...
g.drawImage(image, 0, 0, this);
这对于通过其他方式加载的图像比 ImageIO
更重要,但这是一个很好的做法。
话虽如此,您应该考虑看看 JLabel
,因为它旨在显示开箱即用的图像。看看How to use labels了解更多详情
关于java - 滚动面板不只在图像上显示拇指,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441814/