2012-10-26 39 views
2

我有一個Java應用程序使用JTable來顯示一些數據。我想輸入來自JDialog的數據。Java JComponents在JDialog關閉後沒有重新繪製

我面臨的問題是在打開JDialog後,主窗口GUI不會再刷新。我試圖將其更改爲JFrame,並獲得相同的行爲。如果我使用JPanel更改JTable,也會發生同樣的情況。一切正常,直到主窗口頂部打開一個窗口。在此之後,GUI元素將不會刷新,但按鈕仍會對點擊作出反應。

有人可以幫助我瞭解什麼是錯的。

抱歉,我們無法分享任何代碼。早上五點,我完全忘了。 我有一個框架JTableJButton。該按鈕打開JDialogJDialog具有與JTextFieldJButton嵌套的面板。當我按下JDialog中的按鈕時,它將數據發送到主框架。在那裏我想用收到的數據填充表格。我可以在debuger中看到數據。問題是直到我重新啓動應用程序後它纔會顯示在表格中。我還在表格的相同框架中添加了一個按鈕來測試數據插入,它工作得很好。

public class GUIRezervari { 

private static JButton butonNew; 
private static JTable tabelRezervari; 
public static DefaultTableModel dtm; 
private static JScrollPane scrollPaneTabel; 
private static JPanel panelRezervari; 

private GUIRezervari(){ 

} 

public static JPanel getGui(){ 
    setPanelRezervari(); 

    return panelRezervari; 
} 

private static void setPanelRezervari(){ 
    panelRezervari=new JPanel(); 
    panelRezervari.setLayout(new BoxLayout(panelRezervari, 0)); 

    Box hBox=Box.createHorizontalBox(); 
    hBox.add(Box.createHorizontalGlue()); 
    hBox.add(boxRezervari()); 
    hBox.add(Box.createHorizontalGlue()); 

    panelRezervari.add(hBox); 
} 
private static Box boxRezervari(){ 
    Box vBox=Box.createVerticalBox(); 

    vBox.add(Box.createVerticalStrut(20)); 
    vBox.add(boxButoane()); 
    vBox.add(Box.createHorizontalStrut(10)); 
    vBox.add(boxTabel()); 
    vBox.add(Box.createVerticalStrut(20)); 

    return vBox; 
} 

private static Box boxButoane(){ 
    Box hBox=Box.createHorizontalBox(); 

    butonNew=new JButton("New"); 
    butonNew.addActionListener(new RezervareNouaAL()); 

    hBox.add(Box.createHorizontalStrut(10)); 
    hBox.add(butonNew); 
    hBox.add(Box.createHorizontalGlue()); 
    hBox.add(Box.createHorizontalStrut(10)); 

    return hBox; 
} 

private static Box boxTabel(){ 
    Box hBox=Box.createHorizontalBox(); 

    dtm=new DefaultTableModel(); 
    dtm.addColumn("Date"); 
    dtm.addColumn("Name"); 

    tabelRezervari=new JTable(dtm); 
    scrollPaneTabel=new JScrollPane(tabelRezervari); 

    hBox.add(scrollPaneTabel); 

    return hBox; 
} 
} 

public class RezervareNouaAL implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent ae) { 

    GUIRezervare.getFrame((JFrame)GUIRezervari.getGui().getParent()); 
} 

} 

public class GUIRezervare { 

private static JLabel labelName; 
private static JLabel labelDate; 
private static JTextField fieldName; 
private static JTextField fieldDate; 
private static JButton butonSalveaza; 
private static JButton butonAnuleaza; 
private static JPanel panelRezervare; 
private static JDialog frame; 

private GUIRezervare(){ 

} 

public static void getFrame(JFrame panel) { 

    setGui(); 
    frame = new JDialog(panel, "Rezervare", true); 
    frame.add(panelRezervare); 
    frame.pack(); 
    frame.setVisible(true); 

    frame.setTitle("Adauga rezervare"); 

} 

public static JPanel getGui(){ 
    setGui(); 

    return panelRezervare; 
} 

private static void setGui(){ 
    panelRezervare=new JPanel(); 
    panelRezervare.setLayout(new BoxLayout(panelRezervare, 0)); 
    panelRezervare.setBorder(BorderFactory.createTitledBorder("Rezervare")); 
    panelRezervare.setBackground(new Color(242,197,61)); 

    Box vBox=Box.createVerticalBox(); 

    vBox.add(Box.createVerticalStrut(10)); 
    vBox.add(panelRezervare()); 
    vBox.add(Box.createVerticalStrut(10)); 
    vBox.add(boxButoane()); 
    vBox.add(Box.createVerticalStrut(10)); 

    panelRezervare.add(vBox); 
} 
private static JPanel panelRezervare(){ 
    JPanel panelRezervareT=new JPanel(); 
    panelRezervareT.setBorder(BorderFactory.createTitledBorder("Date rezervare")); 
    panelRezervareT.add(boxRezervare()); 
    panelRezervareT.setBackground(new Color(169,217,190)); 

    return panelRezervareT; 
} 
private static Box boxRezervare(){ 
    Box hBox=Box.createHorizontalBox(); 

    hBox.add(Box.createHorizontalGlue()); 
    hBox.add(boxStanga()); 
    hBox.add(Box.createHorizontalStrut(10)); 
    hBox.add(Box.createHorizontalGlue()); 

    return hBox; 
} 

private static Box boxStanga(){ 
    Box vBox=Box.createVerticalBox(); 

    vBox.add(boxName()); 
    vBox.add(Box.createVerticalStrut(5)); 
    vBox.add(boxDate()); 
    vBox.add(Box.createVerticalStrut(5)); 

    return vBox; 
} 

private static Box boxDate(){ 
    Box hBox=Box.createHorizontalBox(); 

    labelDate=new JLabel("Date :"); 
    fieldDate=new JTextField(); 

    hBox.add(labelDate); 
    hBox.add(Box.createHorizontalStrut(10)); 
    hBox.add(Box.createHorizontalGlue()); 
    hBox.add(fieldDate); 

    return hBox; 
} 

private static Box boxName(){ 
    Box hBox=Box.createHorizontalBox(); 

    labelName=new JLabel("Name :"); 
    fieldName=new JTextField(); 

    hBox.add(labelName); 
    hBox.add(Box.createHorizontalStrut(10)); 
    hBox.add(Box.createHorizontalGlue()); 
    hBox.add(fieldName); 

    return hBox; 
} 


private static Box boxButoane(){ 
    Box hBox=Box.createHorizontalBox(); 

    butonSalveaza=new JButton("Salveaza"); 
    butonSalveaza.addActionListener(new SalveazaClientAL()); 
    butonAnuleaza=new JButton("Anulaeza"); 
    butonAnuleaza.addActionListener(new ActionListener(){ 

     @Override 
     public void actionPerformed(ActionEvent ae) { 

      frame.dispose(); 
     } 

    }); 

    hBox.add(butonSalveaza); 
    hBox.add(Box.createHorizontalStrut(10)); 
    hBox.add(butonAnuleaza); 

    return hBox; 
} 

public static String getFieldName() { 
    return fieldName.getText(); 
} 

public static String getFieldDate() { 
    return fieldDate.getText(); 
} 

public static void inchideFrame(){ 
    frame.dispose(); 
} 
} 

public class SalveazaClientAL implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent ae) { 

    GUIRezervari.dtm.addRow(new Object[]{GUIRezervare.getFieldName(),GUIRezervare.getFieldDate()}); 
GUIRezervare.inchideFrame(); 
} 

} 

這是代碼。感謝您的幫助!

+2

您可以請張貼一些代碼。另外,請解釋'refresh'是什麼意思 - 你是否說你不能再與主JFrame交互,或者JFrame沒有重新繪製(只顯示爲純灰色),還是你期望JTable會自動更新您的JDialog數據?說它「不刷新」並不夠具體。 – wattostudios

+1

*「有沒有人知道爲什麼這種奇怪的行爲?」 - 幾個,其中沒有一個可能會影響你。向我們顯示代碼 – MadProgrammer

+2

http://sscce.org/ –

回答

2

如果您的JDialog模式,可能會發生這種情況。相反,創建一個無模式對話框,並讓您的主窗口註冊爲PropertyChangeListener對話框。在此example中,主窗口中的JPanel在對話框中偵聽ObservedPanel的實例。

+0

嗯...不能重現。 macOS有什麼特別之處? – kleopatra

+0

不,我誤讀_won't刷新爲_不響應用戶手勢_,可能會發生在_modal_對話框中。經過反思,前者建議阻止或重新啓動EDT。更多理由看到代碼。 – trashgod

+0

您的示例運行良好。你能看看我的代碼,並告訴我爲什麼桌子不重新粉刷?謝謝! – Gabriel