为什么我的标签和按钮不会显示在我的JFrame中?

时间:2014-11-08 21:54:25

标签: java swing user-interface jframe layout-manager

我似乎无法想象我的生活。对不起,如果有冗余代码,但我一直在努力尝试,无法弄明白。 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();
     }
}

3 个答案:

答案 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());