2017-10-18 54 views
0

我點擊了一個鼠標單擊事件,調用並顯示一個新的JFrame表單。但是當我點擊時,表單顯示出來沒有任何元素。在我的項目中有2種類型的事件,我用相同的機制處理它們。第一個是完美的,但第二個解決了問題。我也使用pack(),但問題仍然存在。任何人都可以告訴我如何解決這個問題嗎?非常感謝!我的項目是越南語,所以如果任何人想提及代碼或用戶界面中的任何元素,只需寫入無符號就足夠了!Java - 被調用時Swing表單顯示爲空

這裏是事件處理程序:

//The first event 

private void tblClientResultMouseClicked(java.awt.event.MouseEvent evt) {            
    // TODO add your handling code here: 
    DefaultTableModel dm = (DefaultTableModel) tblClientResult.getModel(); 
    int row = tblClientResult.getSelectedRow(); 
    int col = tblClientResult.getSelectedColumn(); 

    if (col == 7) { 
     SearchTruyenFrm searchTruyenFrm = new SearchTruyenFrm(listKH.get(row)); 
     searchTruyenFrm.setVisible(true); 
    } 
} 


//The second one 

private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {            
    // TODO add your handling code here: 
    DefaultTableModel dm = (DefaultTableModel) tblTruyenResult.getModel(); 
    int row = tblTruyenResult.getSelectedRow(); 
    int col = tblTruyenResult.getSelectedColumn(); 

    if (col == 6) { 
     MuonTruyen muonTruyen = new MuonTruyen(); 
     muonTruyen.setTruyen(listTruyen.get(row)); 
     muonTruyen.setPhieuMuon(phieuMuon); 

     //Trouble here (?) 
     ThueTruyenInfoFrm infoFrm = new ThueTruyenInfoFrm(listTruyen.get(row)); 
     infoFrm.setVisible(true); 

     while (infoFrm.isVisible()) { 

     } 

     muonTruyen.setDieuKien(infoFrm.getTxtDieuKien().getText()); 
     muonTruyen.setGiaMuon(Float.parseFloat(infoFrm.getTxtGiaThue().getText())); 
     muonTruyen.setTienPhat(0); 
     muonTruyen.setPaid(false); 
    } 
} 

的構造函數中:

public ThueTruyenInfoFrm(Truyen selected) { 
    initComponents(); 

    txtTenTr.setText(selected.getTen()); 
    txtTacGia.setText(selected.getTacGia()); 
    pack(); 
} 

如何它發生: how the trouble goes

期望的結果: enter image description here

+1

這看起來有點忙'而(infoFrm.isVisible()){ }' –

+0

@ScaryWombat因爲我希望事件去的時候被調用的形式將不再可見 –

+0

呀關於但這似地將環消耗100%的CPU - 也許爲什麼表單從不顯示 - 考慮在循環中添加100ms睡眠 –

回答

3

w ^歡迎來到「親愛的,我已經封鎖了事件派發線程(現在沒有任何工作)」的奇妙世界「

在EDT的上下文中傳遞鼠標事件(如所有基於GUI的事件) ...

private void tblTruyenResultMouseClicked(java.awt.event.MouseEvent evt) {            
    //.... 
    while (infoFrm.isVisible()) { 
    } 
} 

將阻止EDT並阻止任何事件(包括繪畫事件)的進一步處理,基本上掛起您的程序。

我建議你首先閱讀The Event Dispatch Thread,以瞭解整體問題。

要解決您的問題,您需要使用模態對話框,該對話框將等待對話框變爲可見並在關閉後繼續執行。

看一看How to make dialogs

這是一個重要的教訓,因爲你永遠不應該有一個頂層容器開始(如JFrame),而是基地所有你像一個JPanel而不是圖形用戶界面,這給你更大的自由決定何時以及如何在顯示這些組件。

表單編輯器不會教你生成可重複使用或自包含代碼的技術,我強烈建議你考慮花時間手動編寫它們。

+0

正在等待@MadProgrammer用事實取代我非常狂妄的猜測 –

+0

@ScaryWombat啊,但你做得如此出色 – MadProgrammer