我最近重写了很多我的应用程序,在我这样做之前,我想要完成的工作就好了。我正在尝试通过JTabbedPane
中的JCheckBoxMenuItem
按需隐藏JMenuBar
。
我以前做过的事情似乎完全一样,虽然这次它没有用。我尝试使用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)
将无法显示它们,但如果我希望在不重新启动应用程序的情况下完成此操作,则无效。
答案 0 :(得分:3)
查看你的getUtilityTabs函数,无论是什么utilityTabs,你都将返回一个新的UtilityTabs。因此,设置新的utilityTabs的可见性对您已创建的那个没有任何作用。
这应该解决它:
public UtilityTabs getUtilityTabs() {
if (utilityTabs == null) {
utilityTabs = new UtilityTabs();
}
return utilityTabs;
}