2014-01-31 1 views
-3

Получил JFrame с кнопкой на нем, если кнопка нажата, а затем выталкивает JDialog вверх. Если я нажимаю на JFrame, то JDialog удаляет. Но если JDialog активен, и я нажимаю на JButton, у него есть JDIalog и снова его открываю. Я хочу закрыть JDialog также с JButton. БлагодаряКнопка на JFrame доступна для кликов, но JDialog вверх

import javax.swing.*; 

import java.awt.BorderLayout; 
import java.awt.event.*; 

public class Frame extends JFrame { 

    private JButton jButton; 
    private JLabel jLabel = new JLabel("Test"); 
    private JDialog jDialog; 

    public Frame() { 
     getContentPane().add(jLabel); 
     getContentPane().add(getButton(), BorderLayout.EAST); 
     this.setSize(300,300); 
     this.setVisible(true); 
    } 

    private JButton getButton() { 
     if (jButton == null) { 
      jButton = new JButton("TestButton"); 
      jButton.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        button_Pressed(); 
       } 
      }); 
     } 
     return jButton; 
    } 

    private JDialog getJDialog() { 
     if (jDialog == null) { 
      jDialog = new JDialog(); 
      jDialog.setSize(150, 25); 
      jDialog.setUndecorated(true); 
      jDialog.addWindowListener(new WindowListener() { 

       @Override 
       public void windowOpened(WindowEvent e) { 
       } 

       @Override 
       public void windowIconified(WindowEvent e) { 
       } 

       @Override 
       public void windowDeiconified(WindowEvent e) { 
       } 

       @Override 
       public void windowDeactivated(WindowEvent e) { 
        jDialog.dispose(); 
       } 

       @Override 
       public void windowClosing(WindowEvent e) { 
       } 

       @Override 
       public void windowClosed(WindowEvent e) { 
       } 

       @Override 
       public void windowActivated(WindowEvent e) { 

       } 
      }); 
     } 

     return jDialog; 
    } 


    protected void button_Pressed() { 
     getJDialog().setVisible(true);   
    } 

    public static void main(String[] args) { 
     new Frame(); 
    } 

} 
+0

Просто отключите кнопку, пока диалог открыт. – Holger

+0

Вам нужно показать код, если вы не хотите, чтобы вопрос был закрыт. Этот сайт предназначен для помощи с кодом, который вы не можете исправить самостоятельно, а не более общие вопросы, подобные вашим. – RiggsFolly

+0

sry добавил образец кода – user3257220

ответ

0

Дело в том, все, что вы делаете, создавая JDialog, но вы забыли дать ему ссылку на ваш объявил JDialog, так что вы не можете ссылаться на него снова. Так что в вашем методе, вместо этого

protected void button_Pressed() { 
    getJDialog().setVisible(true);   
} 

ли это

protected void button_Pressed() { 
    if (jDialog == null) { 
     jDialog = getJDialog(); 
     jDialog.setVisible(true); 
     return; 
    } 
    if (jDialog.isVisible()) { 
     jDialog.setVisible(false); 
    } else { 
     jDialog.setVisible(true); 
    } 
} 

SIDE ПРИМЕЧАНИЯ

  • Запустите Свинг приложений из Event Dispatch Thread (EDT) как этот

    public static void main(String[] args) { 
        SwingUtilities.invokeLater(new Runnable(){ 
         @Override 
         public void run() { 
          new Frame(); 
         } 
        }); 
    } 
    

    См Initial Threads


UPDATE

Там нет смысла в том, чтобы в WindowListener, поскольку вы управляете потоком с помощью кнопки. избавиться от jDialog.dispose() в windowClosing и он работает.

+0

Изменения не работают, он делает то же самое, что и раньше. Но спасибо – user3257220

+0

Проблема в том, что если я нажму кнопку, когда откроется jdialog, тогда он закроет jdialog и снова откроет его – user3257220

+0

See мое обновление, оно отлично работает. –