>Java >java지도 시간 >Swing에서 JToolBar와 JMenu 사이의 토글 버튼 선택을 동기화하는 방법은 무엇입니까?

Swing에서 JToolBar와 JMenu 사이의 토글 버튼 선택을 동기화하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-20 08:05:14864검색

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

스윙: 버튼 그룹 및 메뉴 항목과 토글 버튼 연결

도구 모음 버튼과 메뉴 항목이 있는 간단한 그림판 애플리케이션의 맥락에서 모양이 다르면 다음과 같은 질문이 생깁니다. 도구 모음 버튼을 선택하면 다른 버튼도 선택 취소되고 해당 메뉴 항목이 선택되도록 하는 방법과 그 반대의 경우도 마찬가지입니다.

ButtonGroup 클래스는 단일 버튼 그룹 내에서 선택을 처리할 수 있지만 여러 그룹을 처리하는 데 가장 적합한 솔루션은 아닐 수 있습니다. 게다가 메뉴가 버튼을 수정하면 무한 재귀가 발생할 위험이 있으며 그 반대의 경우도 마찬가지입니다.

액션을 사용하는 것이 더 나은 접근 방식입니다. Action 인터페이스를 사용하면 버튼, 메뉴 항목 등 여러 구성요소가 동일한 기능을 수행할 수 있습니다. 각 그룹에 동일한 작업을 사용하면 버튼 선택 및 모양 설정을 수동으로 처리할 필요 없이 일관된 동작을 보장할 수 있습니다.

이를 설명하기 위해 다음 코드 조각에서는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.