我似乎无法想象我的生活。对不起,如果有冗余代码,但我一直在努力尝试,无法弄明白。 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();
}
}
答案 0 :(得分:3)
问题是,在顶层容器(窗口)可见后,您可以添加按钮和标签。因此,必须重新验证组件层次结构,以便使组件可见:
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旨在与Layout Managers配合使用,因此不建议使用setBounds(...)
,setLocation(...)
和setXxxSize(...)
等方法。组件的位置和大小是布局管理员的责任,而不是开发人员,除非您有充分的理由这样做。来自Doing Without a Layout Manager (Absolute Positioning)部分:
虽然可以不使用布局管理器,但是如果可能的话,应该使用布局管理器。布局管理员做到了 更容易调整依赖于外观和感觉的组件外观 不同的字体大小,容器的大小变化,以及不同的大小 语言环境。布局管理器也可以被其他人轻松重用 容器以及其他程序。
答案 1 :(得分:2)
将可见元素添加到内容窗格后,您需要调用fra.setVisible(true);
。
答案 2 :(得分:0)
使父框架可见并更新子组件图形的组合将起作用:
fra.setVisible(true);
progressLabel.update(progressLabel.getGraphics());