2013-10-24 3 views
0

------------ Редактировать ---------------Как открыть или закрыть всплывающее окно, как мне нравится?

Вопрос: Я написал JTextField, который имеет всплывающее окно. Это всплывающее окно является undecorated JFrame. Поскольку коды уже были написаны другими людьми, теперь я хочу реализовать следующее:

1. Когда всплывающее окно потеряло фокус, закройте всплывающее окно.

2. При использовании щелчка на JTextField, если всплывающее окно открыто, закройте всплывающее окно, иначе откройте всплывающее окно.

Как это реализовать?

Ниже приведена моя попытка, но на этом есть конфликт.


Во-первых, у меня есть JTextField с MouseListener, используя для запуска JFrame Popup.

 public void mousePressed(MouseEvent arg0) { 
      if (TextField.this.isEnabled() && !popup.isVisible() && TextField.this.isEditable()) 
       open(); 
      else if (popup.isVisible()) { 
       popup.setVisible(false); 
      } 
     } 

добавляю windowfocuslistener в JFrame (всплывающее окно), чтобы убедиться, что он может быть близок, когда фокус lost.like следовать:

 popup.addWindowFocusListener(new WindowFocusListener() { 

      @Override 
      public void windowLostFocus(WindowEvent e) { 
        popup.setVisible(false); 
      } 
     } 

Так проблема возникла, когда я нажимаю JTextField во-первых, это откройте всплывающее окно «Дата», когда я снова нажму на JTextField, он сначала вызовет windowlostfocus на setvisible (false). then mouselisten, откроет всплывающее окно Date. Это не моя мысль, я хочу закрыть всплывающее окно при повторном нажатии. У кого-нибудь есть идея избежать этого? Спасибо за помощь.

+0

вы могли бы объяснить более, лучше всего может быть в SSCCE форме, потому что (насколько я понимаю), если есть JFrame как всплывающие окна, то это дорога к проблемам – mKorbel

+0

Взгляните здесь: http://stackoverflow.com/questions/1900293/how-can-i-create-a-drop-down-menu-in-a-java-swing-toolbar Решение - тема (он реализован в BasicPopupMenuUI, поэтому он должен работать, если тема получена из BasicLookAndFeel). – kiheru

+0

@ mKorbel, почему я использую JFrame, потому что JFrame может получить фокус, но JWindow не может, всплывающее окно Date позволит пользователю вводить. – Sstx

ответ

0

Вы должны следовать поведению, которое уже определено для системы. Например. на всплывающих окнах Windows открываются по правому клику и закрываются по левому клику. Повторное открытие всплывающего окна для другого щелчка правой кнопкой мыши не является ошибкой, это поведение по умолчанию здесь. Достижение правильного поведения в отношении рекомендаций системы проще всего, если не выполнить вручную. Ниже приведен пример всплывающего окна, которое автоматически открывается и закрывается в соответствии с системой.

Всплывающее окно отображает цветовой выбор, который позволяет изменить фон текстового поля. Обратите внимание, как легко все может быть, если вы не делаете это вручную. Всплывающее окно также откроется, если пользователь нажмет клавишу Menu на клавиатуре, о чем вы, возможно, и не подумали.

Используйте то, что другие уже сделали для вас ...

import java.awt.BorderLayout; 
import java.beans.EventHandler; 

import javax.swing.*; 
import javax.swing.event.ChangeListener; 

public class Popups { 
    public static void main(String[] args) { 
    JFrame f=new JFrame("popup"); 
    JTextField tf = new JTextField(30); 
    JPopupMenu popup = new JPopupMenu(); 
    JColorChooser cc = new JColorChooser(); 
    cc.getSelectionModel().addChangeListener(EventHandler.create(
     ChangeListener.class, tf, "background", "source.selectedColor")); 
    popup.add(cc); 
    tf.setComponentPopupMenu(popup); 
    f.getContentPane().add(tf, BorderLayout.NORTH); 
    f.pack(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 
    } 
    static { 
    try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } 
    catch(ClassNotFoundException | InstantiationException 
     | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
     // if this fails life with the default L&F 
    } 
    } 
} 
+0

Вы сказали, что используете JPopupMenu. Но я использую JFrame как Popup. – Sstx

+1

Что я говорю, не используйте JFrame как всплывающее окно. – Holger

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