2016-12-30 127 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