防止 Java 框架的多个实例
Posted
技术标签:
【中文标题】防止 Java 框架的多个实例【英文标题】:Prevent Multiple Instances of Java Frame 【发布时间】:2013-02-07 05:21:09 【问题描述】:我正在处理的应用程序涉及根据用户选择从 JPanel 创建的框架。如果选择两次相同的项目,我试图阻止用户启动同一框架的多个实例。这是我为此目的而写的条件。
主类:
public void showPieGraphFrame()
final PieGraph gPieGraph = new PieGraph("Traffic Type Distribution", counterOne, counterTwo);
gPieGraph.pack();
RefineryUtilities.positionFrameOnScreen(gPieGraph, 0.35, 0.03);
if(!gPieGraph.isVisible())
gPieGraph.setVisible(true);
我想防止多个实例的 PieGraph 类:
public class PieGraph extends ApplicationFrame implements ActionListener
public PieGraph(final String title)
super(title);
// create a menubar
setJMenuBar(createMenuBar());
// create a dataset...
final PieDataset dataset = trafficTypeDataset();
// create the chart...
final JFreeChart chart = createChart(dataset);
// add the chart to a panel...
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(width, height));
setContentPane(chartPanel);
private JFreeChart createChart(final PieDataset dataset)
final JFreeChart chart = ChartFactory.createPieChart("Test Chart", dataset, false, false, false);
final PiePlot plot = (PiePlot) chart.getPlot();
return chart;
但是,它不起作用,您仍然可以多次启动同一个框架。我怎样才能防止这种情况发生?
【问题讨论】:
如需尽快获得更好的帮助,请发帖SSCCE。 那么,是否有机会很快看到 SSCCE,或者您是否打算让我们猜测您的代码为何被破坏? 这是我第一次听说 SSCCE 概念,我不确定我可能遗漏了哪些其他细节。 嗯,到目前为止,您已经从“SSCCE”中获得了“S”。试试rest.. 鉴于我目前在 7 个类中有 1800 行代码,不知道如何发布一个独立的示例。 【参考方案1】:如何防止这种情况发生?
将框架交换为模态JDialog
或JOptionPane
。
【讨论】:
不幸的是,这不是一个选项。该框架包含一个图形和 JMenuBar。 “框架包含一个图形和 JMenuBar。” 为什么从 GUI 中弹出的元素需要它自己的菜单?你似乎对这一切都错了。有关一些基本提示,请参阅The Use of Multiple JFrames, Good/Bad Practice?。 我一直在考虑切换到 JInternalFrame 而不是我现在拥有的。感谢您指出我正在尝试做的可能不是一个好方法。我仍然很想知道是否有办法按照我的要求去做。 如果医生坚持,没有问题。一个 JDialog 也可以有一个 JMenuBar。 “我仍然很想知道是否有办法按照我的要求去做。” 可能。我希望@GiovaniGuizzo 确定了当前失败的原因“只有当你有两个 JFame 对象时才会出现两个窗口。” 这让我认为在那个 sn-p 之外的某个地方有代码(允许)创建多个帧。但是没有看到SSCCE,我真的不能肯定。【参考方案2】:这很简单,不允许您两次调用setVisible
。只有当您有两个 JFame
对象时才会出现两个窗口。将您的 JFrame
设为 Singleton
。
希望我能帮上忙。
【讨论】:
【参考方案3】:使用单例模式作为框架,例如:
public class MainFrame extends JFrame()
private static MainFrame instance;
public static MainFrame getInstance(//parameters)
if (instance == null)
instance = new MainFrame(//parameters)
return instance;
private MainFrame(//parameters)
【讨论】:
以上是关于防止 Java 框架的多个实例的主要内容,如果未能解决你的问题,请参考以下文章