比如说,我在一个JFrame里添加一个JButton: add(new JButton("button"));然后运行,发现这个button显示不出来,但是一单击窗口的边框,或者缩放一下,就立刻显示出来了!请问这是为什么啊??

解决方案 »

  1.   

    加了之后调用JFrame的.validate()方法
      

  2.   

    应该是动态添加的或在主窗口paint后添加的,所以没有画来,窗口缩放时调用了repaint所以出来了。
    在主窗口paint后再画的控件要用validate强制刷新。
      

  3.   

    谢谢了!可是还有个问题..我是在主frame外的一个对话框里向主frame里添加component的,不知道怎样让主frame强制刷新啊?
      

  4.   


    还是一样的。只要有主frame的引用调用JFrame.validate();就可以了。
      

  5.   


    对啊
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Test
    {
    public static void main(String[] args)
    {
    MFrame frame = new MFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }class MFrame extends JFrame
    {
    JButton button;
    MDialog dialog; public MFrame()
    {
    setSize(200, 200);

    dialog = new MDialog(this);

    getContentPane().setLayout(new FlowLayout());
    button = new JButton("show Dialog");
    getContentPane().add(button);

    button.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    dialog.setVisible(true);
    }
    });
    }

    class MDialog extends JDialog
    {
    JFrame owner;

    public MDialog(JFrame owner)
    {
    super(owner, "MDialog", false);
    setSize(100, 100);
    this.owner = owner;
    JButton Add = new JButton("Add");
    Add.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    (MDialog.this).owner.getContentPane().add(new JButton("new"));
    (MDialog.this).owner.validate();
    }
    });

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(Add);
    setVisible(false);
    }
    }
    }
      

  6.   

    谢谢LS各位,可是问题就在这里啊,我想要进行validate操作的那个dialog的owner是另一个dialog,那个dialog的owner才是我的主frame,所以我怎么也不知道该怎样引用frame!
      

  7.   


    谢谢,其实我已经尽可能地让算法和代码简单了,我的原理就是首先在JFrame里启动一项操作,这个操作弹出了一个对话框,然后又弹出了一个对话框进行确认,等到确认完成后才进行下一步操作,也就是我说的在frame里添加一些components。
    我是打算把validate()放在最后一步的确认按钮的actionListener里面,不知这样有无不妥?
      

  8.   

    ......
    绕口令一样
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Test
    {
    public static void main(String[] args)
    {
    MFrame frame = new MFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
    }
    }class MFrame extends JFrame
    {
    JButton button;
    MDialog dialog; public MFrame()
    {
    setSize(200, 200);

    dialog = new MDialog(this);

    getContentPane().setLayout(new FlowLayout());
    button = new JButton("show MDialog");
    getContentPane().add(button);

    button.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    dialog.setVisible(true);
    }
    });
    }
    }class MDialog extends JDialog
    {
    JFrame owner;
    YDialog dialog;

    public MDialog(JFrame owner)
    {
    super(owner, "M", false);
    setSize(100, 100);
    this.owner = owner;
    dialog = new YDialog(this);

    JButton Add = new JButton("show YDialog");
    Add.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    dialog.setVisible(true);
    }
    });

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(Add);
    setVisible(false);
    }
    }class YDialog extends JDialog
    {
    MDialog owner;

    public YDialog(MDialog owner)
    {
    super(owner, "Y", false);
    setSize(100, 100);
    this.owner = owner;

    JButton Add = new JButton("Add");
    Add.addActionListener(new
    ActionListener()
    {
    public void actionPerformed(ActionEvent e)
    {
    (YDialog.this).owner.owner.getContentPane().add(new JButton("new"));
    (YDialog.this).owner.owner.validate();
    }
    });

    getContentPane().setLayout(new FlowLayout());
    getContentPane().add(Add);
    setVisible(false);
    }
    }
      

  9.   


    谢谢,其实这个方法我刚才就根据你在5楼的代码写过了,编译器报的错误说,上面(引用)加粗的那个owner "cannot be resolved as a type"..
      

  10.   

    我的原理就是首先在JFrame里启动一项操作,这个操作弹出了一个对话框,然后又弹出了一个对话框进行确认,等到确认完成后才进行下一步操作,也就是我说的在frame里添加一些components。
    (YDialog.this).owner.owner.validate(); 
    怎么都乱糟糟的啊
    好好好设计下了