在下面的代码中,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?
附言我不想扩展 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
对象,我无法知道大小。
那么如何确定字体的大小呢?
最佳答案
JLabel
(和其他组件)能够生成您所看到的结果的原因是因为它们向父容器提供了有用的大小提示,它的布局管理器使用它来做出关于如何最好地布局子组件。
pack
使用所有这些信息来确定您调用它时制作窗口的最佳可能大小。
默认情况下,JComponent
的首选大小是 0x0,这对您不是很有帮助。首先重写组件 getPreferredSize
方法并返回,例如 new Dimension(200, 200);
现在,请记住,每个布局管理器使用不同的信息来做出决定,您可能还需要查看 getMinimumSize
和 getMaximumSize
关于java - 如何在我的自定义控件中实现类似 JLabel 的大小管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19233499/