2013-04-29 86 views
1

当我在JPopupMenu中添加JtextField时,显示弹出窗口时我无法编辑文本。有人知道为什么 下面是一个代码示例:JTextField在JPopupMenu中不可编辑

public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JPopupMenu popup = new JPopupMenu(); 
     JTextField field = new JTextField("My text"); 
     popup.insert(field, 0); 
     popup.setVisible(true); 
    } 
+0

这是,我怀疑,与窗口的问题重新粉刷过

。出于某种原因,放置在Window/JWindow上的组件仅仅是不可聚焦的 – MadProgrammer 2013-04-29 10:27:20

+0

Thx。有什么办法可以解决这个问题吗? – paranoia25 2013-04-29 10:28:02

+0

使用未修饰的框架或对话框 – MadProgrammer 2013-04-29 10:28:34

回答

2

似乎为我工作好吗:

试试下面这个例子(右键单击内容窗格中任何地方,使弹出可见:

import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPopupMenu; 
import javax.swing.JTextField; 
import javax.swing.SwingUtilities; 
import javax.swing.event.PopupMenuEvent; 
import javax.swing.event.PopupMenuListener; 

public class Main { 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPopupMenu popup = new JPopupMenu(); 
     final JTextField field = new JTextField(20); 
     field.setText("My text"); 
     popup.insert(field, 0); 
     popup.addPopupMenuListener(new PopupMenuListener() { 

      @Override 
      public void popupMenuWillBecomeVisible(PopupMenuEvent e) { 
       SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         field.requestFocusInWindow(); 
         field.selectAll(); 
        } 
       }); 
      } 

      @Override 
      public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { 

      } 

      @Override 
      public void popupMenuCanceled(PopupMenuEvent e) { 

      } 
     }); 
     ((JComponent) frame.getContentPane()).setComponentPopupMenu(popup); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Main().initUI(); 
      } 
     }); 
    } 
} 
+0

用户只有一行错误,你拉动代码的腿lols你可以提到popup.setVisible(true)的主要问题;将不起作用 – 2013-04-29 11:07:16

+0

agreeeeee没有问题+1,只有(可编辑)JComboBox可以有这个问题,因为JPopup去吧 – mKorbel 2013-04-29 11:10:07

+0

@Junaid Hassan aaach,并且再次激活,在API中加以描述(稍加密==需要可见的JFrame, JDialog,JWindow,JOptionPane作为父项),OP – mKorbel 2013-04-29 11:12:42

1

到避免任何猜测

当显示弹出窗口时,我无法编辑文本任何人都知道为什么?

JPopup嵌套的JPopupMenu必须具有父,我的代码示例(原因是有硬编码frame.setLocation(150,100);)

  1. 在这种形式的工作正常,JPopup接受JFrames坐标

  2. 改变这种代码摆动动作的内部

//popupMenu.setVisible(true); 
popupMenu.show(frame, (frame.getHeight()/4), (frame.getWidth()/4)); 

popupMenu.setVisible(true); 
//popupMenu.show(frame, (frame.getHeight()/4), (frame.getWidth()/4)); 

然后PopupMenuListener的发射和事件,但JMenuItems不是从代码

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

public class PopupSample { 

    private JPopupMenu popupMenu = new JPopupMenu(); 
    private javax.swing.Timer timer = null; 
    private JFrame frame = new JFrame("Popup Example"); 

    public PopupSample() { 
     ActionListener actionListener = new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent actionEvent) { 
       System.out.println("Selected: " 
         + actionEvent.getActionCommand()); 
      } 
     }; 
     PopupMenuListener popupMenuListener = new PopupMenuListener() { 
      @Override 
      public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) { 
       System.out.println("Canceled"); 
      } 

      @Override 
      public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) { 
       System.out.println("Becoming Invisible"); 
      } 

      @Override 
      public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) { 
       System.out.println("Becoming Visible"); 
      } 
     }; 
     popupMenu.addPopupMenuListener(popupMenuListener); 
     JSeparator jSeparator = new JSeparator(JSeparator.VERTICAL); 
     jSeparator.setPreferredSize(new Dimension(2, 100)); 
     jSeparator.setBackground(Color.red); 
     popupMenu.add(jSeparator); 
     JMenuItem cutMenuItem = new JMenuItem("Cut"); 
     cutMenuItem.addActionListener(actionListener); 
     popupMenu.add(cutMenuItem); 
     cutMenuItem.setBorder(null); 
     JMenuItem copyMenuItem = new JMenuItem("Copy"); 
     copyMenuItem.addActionListener(actionListener); 
     popupMenu.add(copyMenuItem); 
     JMenuItem pasteMenuItem = new JMenuItem("Paste"); 
     pasteMenuItem.addActionListener(actionListener); 
     pasteMenuItem.setEnabled(false); 
     popupMenu.add(pasteMenuItem); 
     popupMenu.addSeparator(); 
     JMenuItem findMenuItem = new JMenuItem("Find"); 
     findMenuItem.addActionListener(actionListener); 
     popupMenu.add(findMenuItem); 
     JTextField text = new JTextField("text"); 
     popupMenu.add(text); 
     MouseListener mouseListener = new JPopupMenuShower(popupMenu); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.addMouseListener(mouseListener); 
     frame.setLocation(150, 100); 
     frame.setSize(350, 250); 
     frame.setVisible(true); 
     start(); 
    } 

    private void start() { 
     timer = new javax.swing.Timer(1000, updateCol()); 
     timer.start(); 
    } 

    public Action updateCol() { 
     return new AbstractAction("text load action") { 
      private static final long serialVersionUID = 1L; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       EventQueue.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         //popupMenu.setVisible(true); 
         popupMenu.show(frame, (frame.getHeight()/4), (frame.getWidth()/4)); 
        } 
       }); 
      } 
     }; 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       PopupSample popupSample = new PopupSample(); 
      } 
     }); 
    } 

    static class JPopupMenuShower extends MouseAdapter { 

     private JPopupMenu popup; 

     public JPopupMenuShower(JPopupMenu popup) { 
      this.popup = popup; 
     } 

     private void showIfPopupTrigger(MouseEvent mouseEvent) { 
      if (popup.isPopupTrigger(mouseEvent)) { 
       popup.show(mouseEvent.getComponent(), mouseEvent.getX(), 
         mouseEvent.getY()); 
      } 
     } 

     @Override 
     public void mousePressed(MouseEvent mouseEvent) { 
      showIfPopupTrigger(mouseEvent); 
     } 

     @Override 
     public void mouseReleased(MouseEvent mouseEvent) { 
      showIfPopupTrigger(mouseEvent); 
     } 
    } 
} 
相关问题