2016-12-30 129 views
2

向下打开一个新的JFramebalanceFramevalueFrame)我的代码的底部,当用户右键单击该菜单选项时,打开一个新框架并显示其中一个框架。防止多个JFrame窗口打开

然而,关闭新balanceFramevalueFrame弹出,并打开了另一balance/valueFrame,二打通后。关闭这两个并打开另一个后,三个打开。有关如何阻止此事的任何想法?看起来像我的程序记住变量'值'的过去值并打开多个窗口。

table.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      System.out.println("Pressed"); 

     } 
     public void mouseReleased(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       JTable source = (JTable)e.getSource(); 
       int row = source.rowAtPoint(e.getPoint()); 
       int column = source.columnAtPoint(e.getPoint()); 
       String value = table.getModel().getValueAt(row, column).toString(); 

       if (! source.isRowSelected(row)) 
        source.changeSelection(row, column, false, false); 

       popup.show(e.getComponent(), e.getX(), e.getY()); 

       menuItemBalanceSheet.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         try { 
          balanceFrame = new BalanceFrame("BalanceSheet", value); 
         } catch (Exception e1) { 
          e1.printStackTrace(); 
         } 
         balanceFrame.setSize(1200, 600); 
         balanceFrame.setVisible(true); 
         balanceFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        } 
       }); 

       menuItemCompanyValue.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         try { 
          valueFrame = new ValueFrame("Company Value", value); 
         } catch (Exception e1) { 
          e1.printStackTrace(); 
         } 
         valueFrame.setSize(1200, 600);      
         valueFrame.setVisible(true);  
         valueFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
         value. 
        } 
       }); 

      } 
     } 
    }); 
} 
} 
+0

为什么try-catch在此处使用,请问您能解释一下吗? –

+0

1)为了更快地获得更好的帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 2)不确定这里是否有关,但请参阅[使用多个JFrames,好/坏实践?](http://stackoverflow.com/q/9554636/418556) –

+0

@Rakibul islam不知道eclipse也告诉我。 – Zack

回答

2

你不断加入行动听众你菜单,当你只需要一个。 将此代码移动到您的初始化代码:

menuItemBalanceSheet.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         try { 
          balanceFrame = new BalanceFrame("BalanceSheet", value); 
         } catch (Exception e1) { 
          e1.printStackTrace(); 
         } 
         balanceFrame.setSize(1200, 600); 
         balanceFrame.setVisible(true); 
         balanceFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
        } 
       }); 

       menuItemCompanyValue.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         try { 
          valueFrame = new ValueFrame("Company Value", value); 
         } catch (Exception e1) { 
          e1.printStackTrace(); 
         } 
         valueFrame.setSize(1200, 600);      
         valueFrame.setVisible(true);  
         valueFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
         value. 
        } 
       }); 
+0

这非常有帮助,非常感谢。当我将它们移动到值字符串时,我不得不使用set和get方法。 – Zack

0

对于此行一个JFrame的创建:

valueFrame = new ValueFrame("Company Value", value); 

而你又在呼唤setVisible(true)。这就是为什么第二个创建的原因:

valueFrame.setVisible(true); 

考虑忽略其中之一。

提示:

尝试执行setSize()setDefaultCloseOperation()主要ValueFrameBalanceFrame类中。而在已宣布JFrame balanceFrame;JFrame valueFrame;上,尝试这样做,ValueFrame valueFrame;BalanceFrame balanceFrame;在代码的下降部分

现在,在ActionListener试试这个:

menuItemCompanyValue.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     try { 
      new ValueFrame("Company Value", value).setVisible(true); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 
    }   
}); 
+0

没有设置框架可见它不会打开 – Zack

+0

您是否尝试过这种方法?那么我现在简化了我的答案。试试这个,让我知道它是否解决了。 –

+0

这不起作用 – Zack