ホームページ >Java >&#&チュートリアル >Swing で JToolBar と JMenu の間でトグル ボタンの選択を同期するにはどうすればよいですか?

Swing で JToolBar と JMenu の間でトグル ボタンの選択を同期するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-20 08:05:14900ブラウズ

How to Synchronize Toggle Button Selection Between JToolBar and JMenu in Swing?

Swing: トグル ボタンとボタン グループおよびメニュー項目のリンク

ツールバー ボタンとメニュー項目を備えた単純なペイント アプリケーションのコンテキスト形状が異なると、ツールバー ボタンを選択すると他のボタンの選択が解除され、対応するメニュー項目が選択されるようにする方法、またはその逆をどのように行うかという疑問が生じます。 versa.

ButtonGroup クラスはボタンの単一グループ内の選択を処理できますが、複数のグループを処理する場合には最適なソリューションではない可能性があります。さらに、メニューがボタンを変更する場合、またはその逆の場合は無限再帰のリスクが生じます。

より良いアプローチは、アクションを使用することです。アクション インターフェイスを使用すると、ボタンやメニュー項目などの複数のコンポーネントが同じ機能を実行できます。各グループに同じアクションを使用すると、ボタンの選択や形状の設定を手動で処理する必要がなく、一貫した動作を確保できます。

これを説明するために、次のコード スニペットは、JMenu と JMenu の間でアクションを共有する方法を示しています。最近のファイルを管理するための JToolBar:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JToolBar;

public class FileMenu {

    public void create() {
        File userDir = new File(System.getProperty("user.dir"));
        File[] files = userDir.listFiles();

        JMenu menu = new JMenu("Recent Files");
        JToolBar toolBar = new JToolBar(JToolBar.VERTICAL);
        JLabel label = new JLabel(" ", JLabel.CENTER);
        for (File f : files) {
            if (f.isFile() && !f.isHidden()) {
                RecentFile rf = new RecentFile(f, label);
                menu.add(new JMenuItem(rf.getAction()));
                toolBar.add(rf.getAction());
            }
        }
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(menu);

        JFrame f = new JFrame("FileMenu");
        f.setJMenuBar(menuBar);
        f.add(toolBar, BorderLayout.CENTER);
        f.add(label, BorderLayout.SOUTH);
        f.pack();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    class RecentFile extends AbstractAction {

        private final File file;
        private final JLabel label;

        public RecentFile(final File file, final JLabel label) {
            this.file = file;
            this.label = label;
            this.putValue(Action.NAME, file.getName());
            this.putValue(Action.SHORT_DESCRIPTION, file.getAbsolutePath());
        }

        public void actionPerformed(ActionEvent e) {
            label.setText(file.getName());

        }

        public Action getAction() {
            return this;
        }
    }
}

ツールバー ボタンとメニュー項目の両方に同じアクションを使用することで、ボタンの選択を解除するという目的の動作を実現できます。他のメニュー項目を選択し、対応するメニュー項目を選択します。またその逆も同様で、手動による処理や無限再帰のリスクはありません。

以上がSwing で JToolBar と JMenu の間でトグル ボタンの選択を同期するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。