java - 自定义 JComponent 大小默认为零?

标签 java swing user-interface layout jcomponent

我正在尝试将自定义可滚动 JComponent 添加到 JFrame。

JScrollPane sp = new JScrollPane(hg);
frame.getContentPane().add(sp, BorderLayout.CENTER);

hg 是我的自定义组件。

问题是我的自定义组件没有显示。但是,如果我这样做:

hg.setBounds(0, 0, 800, 600);

然后就会显示出来。但当然我不想明确设置大小。我希望它适合框架的中心。

在我的自定义 JComponent 类中,我覆盖了 getPreferredSize():

private Dimension computePreferredSize() {
    return new Dimension((int) (this.getParent().getSize().width * scale),
            (int) (this.getParent().getSize().height * scale));
}

public Dimension getPreferredSize() {
    Dimension d = computePreferredSize();
    System.out.println("Dimension: " + d); // prints reasonable output: Dimension: java.awt.Dimension[width=1201,height=805]
    return d;
}

但这似乎没有任何作用。即使我直接返回固定维度:

public Dimension getPreferredSize() {
    return new Dimension(800, 600);
}

这也行不通。

我还在 ComponentUI 的 paint() 方法中添加了 println,但没有打印任何内容,所以我认为出于某种原因没有调用 paint()。我认为原因是我的自定义组件的大小默认为零,我不确定如何让它调整自己的大小。

所以我的问题是:为什么默认情况下我的 JComponent 不显示,我应该怎么做才能让它自动适应 JFrame 的中心?

谢谢!

最佳答案

在定义 hg 的类中,覆盖 getPreferredSize() 以返回组件的首选大小。可以找到示例 herehere .讨论了基本原理和一些重要的警告 here .

关于java - 自定义 JComponent 大小默认为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13666245/

相关文章:

java - JTable 的高级过滤器

单击 1 次后 JavaFX 刷新按钮消失

java - 用 Java 实现多个 ActionListener

java - 两个 OutputStream 而不是一个?

由 Generic ArrayList 支持的 Java 泛型类

java小程序显示来自本地主机的图像

java - Intellij IDEA - 来自 WSDL 的带有证书的 Web 服务客户端

Java Swing - CardLayout,如何在运行时显示 'update' 卡片?

java - JProgressBar 定位到窗口底部

java - 重置/删除 Swing 中的边框