Suz*_*ioc 1 java swing jcomponent
在下面的代码中,仅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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果运行,该程序将显示窗口,该窗口完全符合控件大小.
同时,如果我定义自定义控件,则默认窗口大小为零:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如何正确扩展JComponent,使其行为类似于JLabel,例如,默认大小为200x100?
PS我不想延长JLabel.我想学习如何JLabel扩展JConmponent.
我看到源代码JLabel,但我无法理解,他们如何控制尺寸.实际上我根本没有看到任何尺寸控制代码.
UPDATE
我发现,如果我不覆盖,可以解决任务,但如果我设置大小:
//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);
}
};
Run Code Online (Sandbox Code Playgroud)
但这只适用于我自己知道尺寸的情况.在字体的情况下,我不知道没有Graphics对象的尺寸.
那么如何在字体的情况下确定大小?
之所以说JLabel(和其它组件)可以生成你所看到的结果,是因为他们提供了有用的大小提示回父容器,这是使用它的布局管理器就如何最好地布局子组件的决定.
使用所有这些信息pack来确定调用窗口时制作窗口的最佳大小.
默认情况下,JComponent首选大小为0x0,这对您没有多大帮助.首先重写组件getPreferredSize方法并返回,例如,new Dimension(200, 200);
现在,请记住,每个布局管理器使用不同的信息来作出决定,你可能还需要看看getMinimumSize和getMaximumSize以及
| 归档时间: |
|
| 查看次数: |
289 次 |
| 最近记录: |