使用JButton打开新的JFrame问题

3

我正在创建一个简单的任务管理器,我的问题是当我点击JButton时,我想打开一个新的JFrame。窗口打开了,但问题是多个窗口打开了。我有两个类App(主)和NewTask。如果有人能看一下代码并看看我做错了什么,那就太好了,如果我发布了太多代码,请原谅,提前感谢。

App Class

    JButton btnNewTask = new JButton("New Task");
    btnNewTask.addActionListener(new ActionListener() 
{
     public void actionPerformed(ActionEvent e)
{
     JFrame frame = new JFrame ("New Task");
     frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
     //frame.getContentPane().add (new NewTask());
     frame.pack();
     frame.setVisible (true);
}
});

btnNewTask.setBounds(10, 216, 116, 23);
contentPane.add(btnNewTask);

   NewTask Class

     /**
 * Launch the application.
 */
//public static void main(String[] args) 
{
    EventQueue.invokeLater(new Runnable() 
    {
        public void run() 
        {
            try 
            {
                NewTask frame = new NewTask();
                frame.setVisible(true);
            } 
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public NewTask() 
{

    setTitle("New Task");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

抱歉,我刚注意到我把这行代码注释掉了 //frame.getContentPane().add (new NewTask()); 如果这一行被注释掉,它只会打开一个空的JFrame窗口。 - user1857403
3
请看:The Use of Multiple JFrames, Good/Bad Practice?。不应该使用多个JFrame,而应该使用JDialogCardLayout。同时也不要使用null/absolute布局,而应该使用合适的LayoutManger。请提供一个SSCCE(可编译代码)作为示例。 - David Kroukamp
2个回答

1
在IT领域中,翻译如下:

只需在ActionListener的字段中创建一个新框架,并使用按钮更改其可见性。

  JFrame frame = null;

  public void actionPerformed(ActionEvent e) {
    if ( frame == null ) {
      frame = new NewTask();
      frame.pack();
    }
    frame.setVisible( !frame.isVisible() );
  }

但是由于多个框架,这仍然是一个非常糟糕的想法 =)

如何制作对话框


谢谢你的帮助,但我仍然遇到问题。我尝试了JDialog而不是JFrame。我的Java技能很差,但还是感谢你。 - user1857403

0
创建多个JFrames最终会成为不良实践。你的程序最终看起来不连贯,代码看起来也很丑陋。
我建议使用CardLayout。它非常容易使用,在最后变得非常方便。此外,如果这是为学校而做的,我一定会建议使用CardLayout,因为教授真的不喜欢当您有特定函数调用打开新的JFrame时。;)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接