0

JTabbedPane があり、各タブには JTextPane があります。

各 JTextPane にはポップアップ メニューがありますが、すべての JTextPane でまったく同じポップアップ メニューを共有したいと考えています。なんで?タブを切り替えると、各ポップアップで同じオプションが強調表示されるようにするためです。

これどうやってするの?各ペインに静的な PopupMenu インスタンスを追加しようとしましたが、1 つに追加すると他のペインから消えてしまいます。

EDIT:次のSSCCEでは、チェックボックスがTabOneでチェックされている場合、TabTwoではチェックされていません。両方のタブでチェックしたい。他のすべてのオプションは、そのオプションを除いて各タブに固有にすることができます。

SSCCE:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;


public class Main {

    public static void main(String[] Args) {
        final Main M = new Main();

        try {
            SwingUtilities.invokeAndWait(new Runnable() {

                @Override
                public void run() {
                    JFrame F = new JFrame("SSCCE");
                    JTabbedPane Pane = new JTabbedPane();
                    Pane.addTab("TabOne", M.new DebugBox(500, 500));
                    Pane.addTab("TabTwo", M.new DebugBox(500, 500));

                    F.setLayout(new BorderLayout());
                    F.add(Pane, BorderLayout.NORTH);
                    F.pack();
                    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    F.setVisible(true);
                }

            });
        } catch (InvocationTargetException | InterruptedException e) {
            e.printStackTrace();
        }
    }


    public class DebugBox extends JTextPane {

        private JScrollPane ScrollPane = null;
        private final JPopupMenu Menu = new JPopupMenu();
        private static final long serialVersionUID = 7731036968185936516L;

        public DebugBox(int Width, int Height) {
            this.ScrollPane = new JScrollPane(this, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            this.setPreferredSize(new Dimension(Width, Height));

            JCheckBoxMenuItem Debug = new JCheckBoxMenuItem(new AbstractAction() {
                private static final long serialVersionUID = -336209978671944858L;

                @Override
                public void actionPerformed(ActionEvent e) {
                                 //DO something here that affects ALL the DebugBoxes because they all share this Menu Option somehow :S
                                 //Change name of this menu option, all instances have their names changed too.
                }
            });

            JMenuItem Copy = new JMenuItem(new AbstractAction() {
                private static final long serialVersionUID = -6774461986513304498L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    DebugBox.this.copy();
                }
            });

            JMenuItem Clear = new JMenuItem(new AbstractAction() {
                private static final long serialVersionUID = -5567371173360543484L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    DebugBox.this.setText(null);
                }
            });

            JMenuItem SelectAll = new JMenuItem(new AbstractAction() {
                private static final long serialVersionUID = -8792250195980016624L;

                @Override
                public void actionPerformed(ActionEvent e) {
                    DebugBox.this.selectAll();
                }
            });

            this.Menu.add(Copy);
            this.Menu.add(Clear);
            this.Menu.add(SelectAll);
            this.Menu.add(Debug);

            Copy.setText("Copy");
            Clear.setText("Clear");
            SelectAll.setText("Select All");
            Debug.setText("Show Debug Box");
            this.setEditable(false);
            this.add(this.Menu);

            this.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseReleased(MouseEvent e) {
                    if (e.isPopupTrigger()) {
                        DebugBox.this.Menu.show(DebugBox.this, e.getX(), e.getY());
                    }
                }
            });
        }
    }
}
4

1 に答える 1

2

オブジェクトを共有したい場合は、オブジェクトを作成し、そのオブジェクトをパラメーターとして他のクラスに渡す必要があります。何かのようなもの:

JPopupMenu popup = createSharedPopupMenu();
Pane.addTab("TabOne", M.new DebugBox(500, 500, popup));
Pane.addTab("TabTwo", M.new DebugBox(500, 500, popup));

次に、任意のテキスト コンポーネントで機能する一般的なアクションを作成する必要があります。DefaultEditorKit は、これらのアクションのいくつかを提供します。

public JPopupMenu createSharedPopupMenu()
{
    JPopupMenu popup = new JPopupMenu()

    JMenuItem copy = new JMenuItem( new DefaultEditorKit.CopyAction() );
    popup.add( copy );
    ...

    return popup.
}

エディター キットがアクションを提供しない場合は、独自のアクションを作成する必要がありTextAction、AbstractAction の代わりに拡張する必要があります。TextAction クラスには、フォーカスのあるテキスト コンポーネントを返すメソッドがあります。したがって、アクションを一般的な方法で実装できます。

また、ポップアップを呼び出すために MouseListener を使用する必要はありません。次の JComponent メソッドを使用できます。

JComponent.setComponentPopupMenu(JPopupMenu popup)
于 2013-05-16T00:54:27.327 に答える