问题描述:例如有一个JFrame,上有一个JButton与一个JPanel.点击JButton会调用一个方法.这个方法是在JPanel内添加几个JButton.这时JPanel内不会立刻显示新增的几个JButton.为什么?但使JFrame最大或最小化等时会显出,这又是为什么?可以让新增的JButton显示出来吗?如果不可以为什么.如何实现类似功能呢?如果可以,要如何做?

解决方案 »

  1.   

    JPanel内不会立刻显示新增的几个JButton,是因为窗体此时尚未刷新。
    最大或最小化窗体时会显示,是因为你让窗体刷新过了。
    当然可以让新增的JButton马上显示出来,调用该JPanel的validate()方法即可。
      

  2.   

    java.awt.Container(容器,JPanel即其子类)的validate()方法的作用如下(摘自JDK API docs):验证此容器及其所有子组件。 使用 validate 方法会使容器再次布置其子组件。已经显示容器后,在修改此容器的子组件的时候(在容器中添加或移除组件,或者更改与布局相关的信息),应该调用上述方法。 示例代码如下:import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    public class MainFrame extends JFrame {

    private JPanel mainPanel = new JPanel();
    private JButton btnAdd = new JButton("添加按钮");
    private JPanel contentPane;

    public MainFrame()
    {
    super("动态添加按钮");
    setSize(400,300);
    //
    JPanel pnlSouth = new JPanel();
    pnlSouth.add( btnAdd );
    //
    contentPane = (JPanel) getContentPane();
    contentPane.add(mainPanel);
    contentPane.add("South",pnlSouth);
    //
    btnAdd.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
    JButton btnNew = new JButton("新按钮");
    mainPanel.add(btnNew);
    mainPanel.validate(); //关键代码
    }
    });
    } public static void main(String[] args) {
    MainFrame f = new MainFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
    }
    }