防止 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】:

如何防止这种情况发生?

将框架交换为模态JDialogJOptionPane

【讨论】:

不幸的是,这不是一个选项。该框架包含一个图形和 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 框架的多个实例的主要内容,如果未能解决你的问题,请参考以下文章

防止多个服务实例

PHP:如何防止扩展类的多个实例

防止打开应用程序的多个实例的跨平台方式

在单个 AppDomain 上运行多个应用程序实例时如何防止属性覆盖?

备份脚本需要一个 pid 锁来防止多个实例

tinyMCE - 防止在一个页面上使用原始 id 作为名称/多个实例