我想添加一个自定义的可滚动JComponent到JFrame。自定义JComponent大小默认为零?
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的中心?
谢谢!
为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 –
安德鲁,谢谢你告诉我! –
你提到了一个'paint()'方法。有两件事情:(1)最好重写'paintComponent'而不是'paint',因为它可以让Swing绘制边框和东西; (2)应该是'paint(Graphics g)',对吗?如果不是,那么'paint()'永远不会被调用。这就是为什么[@Override](http://docs.oracle.com/javase/7/docs/api/java/lang/Override.html)有用。 – wchargin