[英]Why aren't my label and button showing up in my JFrame?
我似乎无法为我的生活弄清楚这一点。 对不起,如果有多余的代码,但我一直在尝试,无法弄清楚。 JFrame
出现但按钮和标签没有出现。
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class ex03 {
int w = 20;
int h = 20;
public ex03() {
JFrame fra = new JFrame("");
fra.setBounds(10, 10, 200, 200);
fra.setLayout(null);
fra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fra.setVisible(true);
JPanel pan = new JPanel();
pan.setLayout(null);
pan.setVisible(true);
fra.getContentPane().add(pan);
JLabel lab = new JLabel();
lab.setBounds(10, 10, w, h);
lab.setOpaque(true);
lab.setBackground(Color.blue);
lab.setVisible(true);
JButton but = new JButton("Play");
but.setBounds(10, 10, 100, 35);
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
w++;
h++;
}
});
but.setVisible(true);
pan.add(lab);
pan.add(but);
}
public static void main (String[] args) {
new ex03();
}
}
你需要调用fra.setVisible(true);
将可见元素添加到内容窗格后。
问题是在顶级容器(窗口)可见后添加按钮和标签。 因此,必须重新验证组件层次结构,以使组件也可见:
pan.add(lab);
pan.add(but);
pan.revalidate();
pan.repaint();
根据Container#add(Component comp)文档:
此方法更改与布局相关的信息,因此使组件层次结构无效。 如果容器已被显示,则此后必须验证层次结构以显示添加的组件。
另一方面,更好的做法是在添加所有组件后打包并使窗口可见,因此组件层次结构仅验证一次。
pan.add(lab);
pan.add(but);
...
frame.add(pan);
frame.pack();
frame.setVisible(true);
请注意,Swing 旨在与布局管理器一起使用,因此不鼓励使用setBounds(...)
、 setLocation(...)
和setXxxSize(...)
等方法。 组件的位置和大小是布局经理的责任,而不是开发人员的责任,除非您有充分的理由这样做。 从没有布局管理器的做(绝对定位)部分:
尽管可以不用布局管理器,但您应该尽可能使用布局管理器。 布局管理器可以更轻松地根据外观和感觉相关的组件外观、不同的字体大小、容器的大小变化以及不同的区域设置进行调整。 布局管理器也可以被其他容器以及其他程序轻松重用。
使父框架可见和更新子组件图形的组合将起作用:
fra.setVisible(true);
progressLabel.update(progressLabel.getGraphics());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.