2013-04-29 82 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); 
     } 
    } 
} 
相關問題