java - 滚动面板不只在图像上显示拇指

标签 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);
}

最佳答案

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

在您的 ImageComponent 类中,您应该考虑重写 getPreferredSize 方法

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

此外,您的 paintComponent 方法永远不需要公开,也永远不需要其他任何人调用它。

您还应该将 this 作为对 drawImageImageObserver 参数的引用传递...

g.drawImage(image, 0, 0, this);

这对于通过其他方式加载的图像比 ImageIO 更重要,但这是一个很好的做法。

话虽如此,您应该考虑看看 JLabel,因为它旨在显示开箱即用的图像。看看How to use labels了解更多详情

关于java - 滚动面板不只在图像上显示拇指,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441814/

相关文章:

java - 无法从图像数组列表加载 imageView

java - 具有两个类的 Java 代码中的 NoSuchField 错误

java - 计算每手扑克起手牌的唯一索引

user-interface - 在 TreeView Odoo 13 之外添加按钮

Javafx Canvas 与 Pane

c++ - QObject::connect: 无法对类型为 'QVector<int>' 的参数进行排队

java - Spring AOP - 异常 : org. springframework.beans.factory.BeanDefinitionStoreException:

Java Swing CardLayout 多个文件

java - 程序中的各种 JFrame

java - GUI 不更新简单游戏中的值