1

に を追加するJtextFieldJPopupMenu、ポップアップが表示されたときにテキストを編集できません。理由を知っている人はいますか?コード例を次に示します。

 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);
    }
4

2 に答える 2

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();
            }
        });
    }
}
于 2013-04-29T10:58:07.433 に答える
1

憶測を避けるために

ポップアップが表示されているときにテキストを編集できません。理由を知っている人はいますか?

JPopup ネストされた JPopupMenu には、親、私のコード例が必要です (hardcodes frame.setLocation(150, 100); がある理由)

  1. この形式では正しく動作し、JFrames 座標を受け入れる JPopup

  2. Swing Action 内でこのコードを変更します

から

//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);
        }
    }
}
于 2013-04-29T11:40:38.653 に答える