2012-04-07 98 views
0

我有一個JDialog,並希望該商店後關閉它確認文本框的數據......現在我已經沒有問題,從存儲箱中的數據,但之後關閉Swing對話框,進行的操作

操作後如何關閉此對話框?

似乎是一個簡單的事情,但我還沒有找到解決方案。

public class test extends JDialog { 

    private final JPanel contentPanel = new JPanel(); 

    public test() { 
     setBounds(100, 100, 450, 300); 
     getContentPane().setLayout(new BorderLayout()); 
     contentPanel.setLayout(new FlowLayout()); 
     contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     getContentPane().add(contentPanel, BorderLayout.CENTER); 
     { 
      JPanel buttonPane = new JPanel(); 
      buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
      getContentPane().add(buttonPane, BorderLayout.SOUTH); 
      { 
       JButton okButton = new JButton("OK"); 
       okButton.setActionCommand("OK"); 
       buttonPane.add(okButton); 
       getRootPane().setDefaultButton(okButton); 
          okButton.addActionListener(new java.awt.event.ActionListener() { 
        public void actionPerformed(java.awt.event.ActionEvent e) { 
         try{ 

          int x=Integer.parseInt(textField.getText()); 
          saver.saveN(x); 

         }catch(Exception ecc){ 
          JOptionPane.showMessageDialog(Test.this,"error"); 
         } 
        } 
       }); 
      } 

     } 
    } 

} 

回答

3
+0

很好的答案+1 – mKorbel 2012-04-07 20:02:52

+0

我不能使用的Dispose()這個元素contentPanel.setVisible(假)上,如果我使用;隱藏對話框的所有內容,但窗口仍然打開...出了什麼問題? – AndreaF 2012-04-07 20:28:57

+0

@AndreaF你正在調用'contentPanel'上的方法,而不是'JDialog'。由於你的類從'JDialog'擴展,調用'this.dispose()'或'this.setVisible(false)'。 – Jeffrey 2012-04-07 20:33:03

0

如果您打算與所有的字段值和組件狀態離開相同,當你關閉它再次使用一個JDialog,使用調用setVisible(假)。

在任何其他情況下,呼叫處理(),以避免殘留在所述存儲器中的的JDialog當不再需要它。

+0

如何在此JDialog上調用dispose()? – AndreaF 2012-04-07 20:32:32

+0

如果你想從Test類中執行它,請執行'this.dispose()'。如果你有一個Test實例,請執行'instance.dispose()'。 – MarioDS 2012-04-07 20:37:25

+0

從-this-指聽者不至的JDialog,所以如果我嘗試使用監聽this.dispose()得到一個編譯錯誤 – AndreaF 2012-04-07 20:40:55

1
  • 如果你使用這個對話框只有一次一次再有就是同使用dispose()setVisible(false)

  • 的情況下,你調用這個方法比一次時間更多,那麼你可以使用HIDE_ON_CLOSEsetVisible(false)better would be re_use this JDialog

編輯

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.Timer; 
import javax.swing.border.EmptyBorder; 
public class Test { 

    private static final long serialVersionUID = 1L; 
    private JDialog dialog = new JDialog(); 
    private final JPanel contentPanel = new JPanel(); 
    private Timer timer1; 
    private JButton killkButton = new JButton("Kill JDialog"); 

    public Test() { 
     contentPanel.setLayout(new FlowLayout()); 
     contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); 

     JPanel buttonPane = new JPanel(); 
     JButton okButton = new JButton("OK"); 
     okButton.setActionCommand("OK"); 
     buttonPane.add(okButton); 

     killkButton.setActionCommand("Kill JDialog"); 
     buttonPane.add(killkButton); 

     dialog.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE); 
     dialog.addWindowListener(new WindowListener() { 

      public void windowOpened(WindowEvent e) { 
      } 

      public void windowClosing(WindowEvent e) { 
       startTimer(); 
      } 

      public void windowClosed(WindowEvent e) { 
      } 

      public void windowIconified(WindowEvent e) { 
      } 

      public void windowDeiconified(WindowEvent e) { 
      } 

      public void windowActivated(WindowEvent e) { 
      } 

      public void windowDeactivated(WindowEvent e) { 
      } 
     }); 
     dialog.setLayout(new BorderLayout()); 
     dialog.getRootPane().setDefaultButton(okButton); 
     dialog.add(buttonPane, BorderLayout.SOUTH); 
     dialog.add(contentPanel, BorderLayout.CENTER); 
     dialog.pack(); 
     dialog.setLocation(100, 100); 
     dialog.setVisible(true); 
     setKeyBindings(); 
    } 

    private void setKeyBindings() { 
     killkButton.getInputMap(
       JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
       KeyStroke.getKeyStroke("ENTER"), "clickENTER"); 
     killkButton.getActionMap().put("clickENTER", new AbstractAction() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.exit(0); 
      } 
     }); 
    } 

    private void startTimer() { 
     timer1 = new Timer(1000, new AbstractAction() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 

        @Override 
        public void run() { 
         dialog.setVisible(true); 
        } 
       }); 
      } 
     }); 
     timer1.setDelay(500); 
     timer1.setRepeats(false); 
     timer1.start(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       Test test = new Test(); 
      } 
     }); 
    } 
} 
+0

我還沒有嘗試過用設置可見(假),但只隱藏的是保持打開狀態 – AndreaF 2012-04-07 20:24:16

+0

@AndreaF我闡述了窗口的內容,這應該是也許正確的方式,請參閱我的編輯 – mKorbel 2012-04-07 20:53:18

+0

我還沒有解決與傑弗裏建議,還是要謝謝你 – AndreaF 2012-04-07 21:03:50