我正在尝试构建我自己的JComponent,并不想开始。我可以创建一个对象,然后将其添加到JFrame或JPanel,它将添加到组件列表中。我不知道如何setPreferredSize()。
问题:如何设置setPrefferedSize(),并在创建对象的所有实例时自动将此特定大小设置为?
**@Override
public void setPreferredSize(Dimension preferredSize) {
super.setPreferredSize(preferredSize);
}**
类别:
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
public class myComponent extends JComponent {
private static final long serialVersionUID = 1L;
public myComponent() {
setPreferredSize(new Dimension(20,50));
setToolTipText(new String("This is a custom buttion"));
}
**@Override
public void setPreferredSize(Dimension preferredSize) {
super.setPreferredSize(preferredSize);
}**
@Override
public void setToolTipText(String text) {
super.setToolTipText(text);
}
@Override
public void paintComponent(Graphics g) {
g.drawString("I love pizza", 100, 100);
g.drawRect(10, 10, 200, 200);
}
public static void main(String[] args) {
myComponent t = new myComponent();
}
}
答案 0 :(得分:1)
致电时
setPreferredSize(new Dimension(20,50));
在构造函数中,那么类的所有实例都将具有此首选大小(当然,只要它们使用此构造函数)。
顺便说一句:覆盖一个方法而只是调用此方法的super
版本并没有多大意义(只要你不增加从protected
到public
的可见性或所以...)。并且您没有调用super
版本的唯一方法是您应该实际执行此操作:通常,您将paintComponent
覆盖为
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Your drawing here...
}
BTW2:不要使用new String("foo")
。这一行
setToolTipText(new String("This is a custom buttion"));
应该是
setToolTipText("This is a custom buttion");
编辑:也许人们也应该提到这一点:"首选尺寸背后的意图"在Swing中略有不同。通常,扩展JComponent的类有一个"内在的"首选尺寸。在你的情况下,这可能是(220,220),因为你想绘制一个带有10像素边距的200x200矩形。但是,此组件的用户应该能够通过调用setPreferredSize
并传入所需大小来修改此首选大小。但是当他们打电话给setPreferredSize(null)
时,那就是原来的"内在的"应再次使用首选尺寸。因此,为了确保正确处理首选大小,您可以/应该实现这样的方法:
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;
public class myComponent extends JComponent {
private static final long serialVersionUID = 1L;
public myComponent() {
// setPreferredSize(new Dimension(20,50)); Don't call this here!
setToolTipText(new String("This is a custom buttion"));
}
@Override
public Dimension getPreferredSize() {
if (super.isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(220,220); // or (20,50), just as you want...
}
...
}