2

最近、多くのアプリケーションを書き直しましたが、書き直す前に、達成しようとしていることは問題なく機能しました。JTabbedPaneでを介して、オンデマンドで非表示にしようとしてJCheckBoxMenuItemJMenuBarます。

以前に行ったことはまったく同じように見えましたが、今回は機能していません。私は使ってみましinvokeLater(...)たが、役に立ちませんでした。

これが私が取り組んでいるものの基本的な例です:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListModel;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;

public class ToolkitFrame extends JFrame {

    private static final long serialVersionUID = -6757985823719418526L;

    public static void main(String[] args) {
        new ToolkitFrame().construct();
    }

    private UtilityTabs utilityTabs;

    public UtilityTabs getUtilityTabs() {
        if (utilityTabs == null) {
            utilityTabs = new UtilityTabs();
        }
        return new UtilityTabs();
    }

    public ToolkitFrame() {
        super();
    }

    public void construct() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(getGameScreen(), BorderLayout.CENTER);
        add(getUtilityTabs().getTabs(), BorderLayout.EAST);
        setJMenuBar(getJMenuBar());
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public JMenuBar getJMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu viewMenu = new JMenu("View");
        final JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem("Show Utilities");
        checkbox.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent arg0) {
                getUtilityTabs().getTabs().setVisible(checkbox.isSelected());
                System.out.println("Tabs should be: " + (checkbox.isSelected() ? "visible" : "hidden"));
            }

        });
        checkbox.setSelected(true);

        viewMenu.add(checkbox);

        menuBar.add(viewMenu);

        return menuBar;
    }

    public JPanel getGameScreen() {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(765, 503));
        panel.setBackground(Color.BLACK);
        return panel;
    }

    class UtilityTabs {

        private JTabbedPane tabs;

        public JTabbedPane getTabs() {
            return tabs;
        }

        private Tab tab;

        public Tab getTab() {
            if (tab == null) {
                tab = new Tab();
            }
            return tab;
        }

        public UtilityTabs() {
            tabs = new JTabbedPane(JTabbedPane.TOP);
            tabs.setPreferredSize(new Dimension(275, 503));
            tabs.add("FooBar", getTab());
            tabs.setVisible(true);
        }

        class Tab extends JPanel {

            private static final long serialVersionUID = 677183279827434278L;

            private DefaultListModel<String> listModel;

            private JList<String> list;

            public Tab() {
                construct();
            }

            public void construct() {
                listModel = new DefaultListModel<String>();
                for (String name : new String[] { "foo", "bar" }) {
                    listModel.addElement(name);
                }
                list = new JList<String>(listModel);
                add(new JScrollPane(list));
            }

        }

    }

}

誰かが私が間違っていることを教えてもらえますか?基本的に、ユーザーの設定に応じて(再起動せずに)ゲームのユーティリティを表示または非表示にします。

使用してsetVisible(false)も表示されませんが、アプリケーションを再起動せずに実行したい場合は役に立ちません。

4

1 に答える 1

3

getUtilityTabs関数を見ると、utilityTabsが何であるかに関係なく、常に新しいUtilityTabsが返されます。したがって、新しいutilityTabsの可視性を設定しても、既に作成したものには何の影響もありません。

これで修正されるはずです:

    public UtilityTabs getUtilityTabs() {
    if (utilityTabs == null) {
        utilityTabs = new UtilityTabs();
    }
    return utilityTabs;
}
于 2013-03-04T20:56:36.763 に答える