2014-07-07 6 views
3

JPopupmenu를 만들고 JTextField를 추가했습니다. 금속이나 후광을 사용할 때 모든 것이 문제가되지 않습니다. 문제는 LookAndFeel을 Windows로 전환 할 때입니다. ALT를 바로 누를 수 없습니다.이 키를 누르면 JPopupmenu가 숨겨집니다.LookAndFeel 동작의 차이점

Windows LookAndFeel에서 오른쪽 화살표를 사용하여 국가 기호를 쓸 수 있습니까? 그 점의 종류의,

import javax.swing.*; 
import java.awt.event.*; 

public class Popup extends JFrame { 

    JPopupMenu popup; 
    JPanel panel; 
    JTextField field; 

    public Popup(){ 
     setSize(500,400); 
     try { 
      //UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel"); 
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 
     } catch (ClassNotFoundException | InstantiationException 
       | IllegalAccessException | UnsupportedLookAndFeelException e1) { 
      e1.printStackTrace(); 
     } 
     SwingUtilities.updateComponentTreeUI(this); 

     popup = new JPopupMenu(); 
     field = new JTextField(10); 
     popup.add(field); 
     JButton button = new JButton("Options"); 
     button.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     });   

     panel = new JPanel(); 
     panel.add(button); 
     add(panel); 
    } 

    public static void main(String[] args){ 
     Popup pop = new Popup(); 
     pop.setVisible(true); 
    } 

} 
+0

그래, 내가 기대하는 무엇

Popup

. 당신이 달성하려고하는 것은 무엇입니까? 대신 – MadProgrammer

+0

JWindow 또는 꾸며지지 않은 JFrame을 사용하는 것이 좋습니다. [link] (http://oi58.tinypic.com/b5lceu.jpg) JList에서 항목을 필터링하고 마지막으로 하나를 선택하려고합니다. – Zbijlud

+2

장식되지 않은 JFrame을 사용하는 것이 좋겠지 만 WindowFocusListener를 사용하여 창 자동 숨기기를 결정하십시오. 많은 OS의 alt는 필드와 메뉴에 대한 바로 가기 키를 표시하려고합니다. – MadProgrammer

답변

4

JPopupMenu 작동 요구 사항의 매우 구체적인 설정을 가지고 있으며, 예, 그들은보기 사이에서 변경 않으며 느낀다.

당신이 할 수있는 일은 장식되지 않은 JFrame을 사용하여 자신 만의 팝업을 생성하는 것입니다. 여기에있는 트릭은 다른 컴포넌트가 포커스를 얻었을 때 자동 닫기와 같은 팝업의 대부분을 모방하는 것입니다. ...

이것은 단지 개념의 증거를 제공하는 빠른 예제, 개인적으로도 이스케이프 키에 대한 키 바인딩, 검색 창에서 팝업이 닫히도록 요청할 수있는 일종의 리스너 인터페이스 및 일부 구성 요소를 자동으로 포커스 할 수있는 기능을 추가 할 것입니다. ... 윈도우가 표시되었지만, 그 날의

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
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.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestPopup { 

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

    public TestPopup() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private JButton show; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      show = new JButton("..."); 
      show.addActionListener(new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        PopupWindow window = new PopupWindow(); 
        window.show(show, 0, show.getHeight()); 
       } 
      }); 
      add(show); 
     } 

    } 

    public class SearchPane extends JPanel { 

     private JList list; 
     private JTextField search; 

     public SearchPane() { 
      setLayout(new BorderLayout()); 
      list = new JList(); 
      list.setPrototypeCellValue("This is just a test"); 
      list.setVisibleRowCount(20); 
      search = new JTextField(10); 
      add(new JScrollPane(list)); 
      add(search, BorderLayout.SOUTH); 
     } 

    } 

    public class PopupWindow extends JFrame { 

     private SearchPane searchPane; 

     public PopupWindow() { 
      setUndecorated(true); 
      setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
      addWindowFocusListener(new WindowFocusListener() { 

       @Override 
       public void windowGainedFocus(WindowEvent e) { 
       } 

       @Override 
       public void windowLostFocus(WindowEvent e) { 
        dispose(); 
       } 
      }); 
      searchPane = new SearchPane(); 
      add(searchPane); 
      pack(); 
     } 

     public void show(JComponent parent, int x, int y) { 
      Point point = new Point(x, y); 
      SwingUtilities.convertPointToScreen(point, parent); 
      setLocation(point); 
      setVisible(true); 
     } 

    } 

} 
+0

고마워요! 나는 너의 포스트를봤을 때 그 일을하고 있었다. – Zbijlud

+0

희망 사항을 알려주세요.) – MadProgrammer