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);
}
}
Да, это то, что я пытался, я редактировал свой образец кода, чтобы отразить это. WindowFocusListener всегда устанавливает видимость JDialog в false, и поэтому ActionListener всегда будет показывать видимость JDialog на true – Strokes
. Я предлагаю, чтобы фокус потерял событие, когда окно скрывается, щелкнув по кнопке, вставьте отладочный вывод в ваш код, пожалуйста, –
Правильно, он делает .. Мне это известно – Strokes