2015-08-19 2 views
0

Java Gurus,Переключение JDialog видимость на нажатие кнопки или потерять фокус

Глядя переключения визуальность JDialog в когда JButton нажата или когда JDialog теряет фокус, т.е. когда другой области экрана вне JDialog становится активным. Lose focus работает нормально, поскольку он передается WindowFocusListener, но я не могу получить функциональность для JButton, то есть 1-й клик => JDialog, 2-й клик => JDialog невидимый, 3-й щелчок => JDialog видимый.

Я действительно не хочу идти по пути создания JDialog modal или подсчета щелчков на кнопке.

Любые идеи достижения вышеуказанной функциональности простым, чистым способом?

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowEvent; 
import java.awt.event.WindowFocusListener; 

import javax.swing.*; 


public class TestFrameExample { 

    public static void main(String s[]) { 

     final JDialog dialog = new JDialog(); 
     final JButton button = new JButton(); 

     JFrame frame = new JFrame("Help me toggle JDialog!"); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout()); 

     JLabel label = new JLabel("Dialog visibility should toggle when JButton is pressed!"); 

     button.setText("Toggle Dialog"); 
     button.setFocusable(false); 
     button.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e){ 
       //Execute when button is pressed 
       dialog.setVisible(!dialog.isVisible()); 
       dialog.setLocation(new Point(button.getLocationOnScreen().x, button.getLocationOnScreen().y+30)); 
      } 
     }); 
     dialog.setSize(new Dimension(110,80)); 
     dialog.setVisible(false); 
     dialog.setBackground(null); 
     dialog.setModal(false); 
     dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
     dialog.setLocationRelativeTo(null); 
     dialog.setAlwaysOnTop(false); 
     dialog.setUndecorated(true); 
     dialog.addWindowFocusListener(new WindowFocusListener(){ 
      public void windowLostFocus(WindowEvent arg0) { 
       dialog.setVisible(false); 
      } 
      public void windowGainedFocus(WindowEvent e) { 

      } 
     }); 
     ((JComponent) dialog.getContentPane()).setBorder(new RoundedBorder(Color.gray, 1,1,12)); 
     ((JComponent) dialog.getContentPane()).setOpaque(false); 

     panel.add(label); 
     panel.add(button); 

     frame.add(panel); 
     frame.setSize(350, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

ответ

0
dialog.setVisible(!dialog.isVisible()); 
+0

Да, это то, что я пытался, я редактировал свой образец кода, чтобы отразить это. WindowFocusListener всегда устанавливает видимость JDialog в false, и поэтому ActionListener всегда будет показывать видимость JDialog на true – Strokes

+0

. Я предлагаю, чтобы фокус потерял событие, когда окно скрывается, щелкнув по кнопке, вставьте отладочный вывод в ваш код, пожалуйста, –

+0

Правильно, он делает .. Мне это известно – Strokes

Смежные вопросы