netbeans 如何判断一个JFrame窗口是否已经打开?

ctrmrzij  于 2023-08-05  发布在  其他
关注(0)|答案(4)|浏览(147)

我有一个JFrame和一个Button,它打开了一个不同的JFrame。但我希望按钮只打开第二帧一次。问题是,每次我点击它,我都会得到一个新的框架示例。这一定是一个非常常见的问题,因为我正在阅读一本关于如何创建此GUI的书。我觉得很奇怪,作者没有提到这个“功能”。
那么,如何防止按钮打开新框架的多个副本?

hk8txs48

hk8txs481#

不要让按钮每次都创建一个新的JFrame,而是让第二个JFrame成为第一个JFrame的成员,并且只让按钮调用jframe2.setVisible(true);

class JFrame1 {
   JFrame2 jframe2=...;
   JButton button=...;

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

字符串

5rgfhyps

5rgfhyps2#

更新!
试试这个:

JFrame frame2 = new JFrame(); // instance variable

...

//when button is clicked
button.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if(!frame2.isVisible())
            frame2.setVisible(true);
    }
});

字符串
确保您正在手动处理所有JFrame的关闭,如下所示:

frame2.addWindowListener(new WindowAdapter() {

    @Override
    public void windowClosing(WindowEvent e) {
        // handle closing the window
        frame2.setVisible(false);
        frame2.dispose();
    }
});


而不是使用JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
希望这对你有帮助。

vhipe2zx

vhipe2zx3#

您应该保留对第一次打开的子帧的引用。在第二次你首先检查你是否有一个参考或没有,然后决定创建一个新的框架或把重点放在现有的开放框架。

作为OP评论的回答的示例(类似于@AlexanderTorstling的其他回答,但不是立即创建子帧):

class MainFrame extends JFrame {
  private JFrame subFrame = null;

  MainFrame() {
    ...
    button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
         if (subFrame == null) {
           subFrame = new JFrame();
           ...
         }
         subFrame.setVisible(true);
      }
    });    
  }
}

字符串
此示例的优点还在于,如果主框架已关闭,则可以通过注册的WindowAdapter关闭子框架。

mf98qq94

mf98qq944#

请尝试以下代码片段:

JFrame frame2 = new JFrame(); // instance variable
boolean secondWindowIsOpne = false;

//when button is clicked
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
    if(secondWindowIsOpne == false){
        frame2.setVisible(true);
        secondWindowIsOpne  = true;
    }
    else{
      System.out.println("This Window is already running");
   
  }
   });

字符串
确保您正在手动处理所有JFrame的关闭,如下所示:

frame2.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
    // handle closing the window
      secondWindowIsOpne = false;
    frame2.setVisible(false);
    frame2.dispose();
}

 });

相关问题