在下面的代码中,仅JFrame
包含JLabel
在BorderLayout
.
package test.swing;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class Try_JLabel_01 {
public static void main(String[] arg) {
JFrame frame = new JFrame() {
JLabel label = new JLabel("label");
{
setLayout(new BorderLayout());
add(label, BorderLayout.CENTER);
}
};
frame.pack();
//frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
如果运行,这个程序会显示窗口,它正好适合控件的大小。
同时,如果我定义我的自定义控件,则默认窗口的大小为零:
public class Try_JLabel_02 {
public static void main(String[] arg) {
JFrame frame = new JFrame() {
//JLabel label = new JLabel("label");
JComponent label = new JComponent() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(0, 0, 200, 100);
}
};
{
setLayout(new BorderLayout());
add(label, BorderLayout.CENTER);
}
};
frame.pack();
//frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
如何正确扩展 JComponent,使其行为类似于 JLabel,例如,默认大小为 200x100?
PS我不想延长JLabel
。我想学习如何JLabel
扩展JConmponent
。
我看到 的源代码JLabel
,但我不明白,它们如何控制大小。实际上我在那里根本看不到任何尺寸控制代码。
更新
我发现如果我不覆盖可以解决任务,但是如果我设置大小:
//JLabel label = new JLabel("label");
JComponent label = new JComponent() {
{
setMinimumSize(new Dimension(200, 100));
setPreferredSize(new Dimension(200, 100));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(0, 0, 200, 100);
}
};
但这仅在我自己知道尺寸的情况下才有效。在字体的情况下,如果没有Graphics
对象,我就无法知道大小。
那么如何确定字体的大小呢?