Вначале я спросил, не изложил ли я свой вопрос/проблему, поэтому я объясню это лучше. У меня есть JButton
, который устанавливает вид JDialog
. JDialog имеет WindowListener
, который устанавливает его на НЕ видное событие windowDeactivated()
, которое запускается в любое время, когда пользователь щелкает за пределами диалогового окна. Кнопка ActionListener
проверяет, является ли диалоговое окноVisible, скрывает его, если true, показывает его, если false.Создайте окно проверяющих свойств, кнопка, управляемая как JDialog
windowDeactivated()
всегда будет срабатывать, если нажать на кнопку или нет, если пользователь нажимает за диалоговое окно. Проблема, с которой я сталкиваюсь, - это когда пользователь нажимает кнопку, чтобы закрыть диалог. Диалог закрывается WindowListener
, а затем ActionListener
пытается его отобразить.
Если windowDeactivated()
не setVisible(false)
, то диалог по-прежнему открыт, но за родительским окном. Я спрашиваю, как получить доступ к местоположению щелчка внутри windowDeactivated()
. Если я знаю, что пользователь нажал на кнопку, а windowDeactivated() может пропустить скрытие диалога, так что кнопка ActionListener
будет видеть, что она все еще видна и скрывает ее.
public PropertiesButton extends JButton { private JDialog theWindow; public PropertiesButton() { theWindow = new JDialog(); theWindow.setUndecorated(true); theWindow.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); theWindow.add(new JMenuCheckBoxItem("Something")); theWindow.addWindowListener(new WindowListener() { // just an example, need to implement other methods public void windowDeactivated(WindowEvent e) { theWindow.setVisible(false); } }); this.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (theWindow.isVisible()) { theWindow.setVisible(false); } else { JButton btn = (JButton)e.getSource(); theWindow.setLocation(btn.getLocationOnScreen.x,btn.getLocationOnScreen.x-50); theWindow.setVisible(true); } } }); theWindow.setVisible(false); } }
Не знаете, в чем вопрос. Похоже, вы поняли это. Это выглядит правильно. (На первый взгляд) – jjnguy
То, что у меня выше, сделает все, что я хочу, за исключением случаев, когда вы нажимаете за пределами диалогового окна. Щелчок снаружи закрывает диалоговое окно, и это нормально, но когда я нажимаю кнопку, чтобы открыть диалог, он не открывается в первый раз.Из того, что я понимаю, WindowListener запускается перед ActionListener, и хотя диалог НЕ отображается на самом деле, когда срабатывает ActionListener, вызов .isVisible() возвращает значение true. Таким образом, кнопка будет .setVisible (false), даже если она не видна. – Brian
Брайан, вы можете использовать «WindowAdapter» вместо прослушивателя окна. Тогда вам нужно только реализовать методы, которые вы хотите. – jjnguy