0

如何防止 Scanner 类的多个实例运行?有关于线程和锁等的信息,但我无法让它们在我的应用程序上工作。例如,我点击支付,然后出现一个 Scanner 实例,然后是创建支付的取消。然后当我点击支付时,扫描仪的数量会翻倍。这里有一个简短的总结:

@ PlaceOrder.java,我有:

btnPay.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) 
{
    java.awt.EventQueue.invokeLater(new Runnable() 
    {
           public void run() 
           {
                 PlaceOrder.this.setVisible(false);

                 new boundary.ScannerUI().setVisible(true);  
                 PlaceOrder.this.dispose();                                 
           }
    });             

} });

@ Scanner.java,我有:

btnCancel.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent evt)
            {
                //ScannerUI.this.setVisible(false);
                //ScannerUI.this.dispose();                     

                new boundary.PlaceOrder().setVisible(false);
                ScannerUI.this.dispose();
            }
        }); 
4

2 回答 2

0

您需要的称为Singleton-Pattern,这是一种非常常见且基本的设计模式。

基本上,单例模式提供了一个静态方法来实例化对象(如果它尚未实例化)并返回(已经)创建的实例。

单身人士应该有

  • 一个私有构造函数,
  • 一个静态实例,
  • 和一个静态访问方法,它创建并返回实例。

在您的情况下, ScannerUI 类看起来像这样,

public class ScannerUI extends JFrame { //extending JFrame is just my assumption
// as the OP didn't provided the class declaration code


    //static instance
    private static volatile ScannerUI instance;

    //private constructor
    private ScannerUI() {
        // Do nothing.
    }

    //static access method, which will be called instead of the constructor
    //UPDATE: added isDisplayable because it is disposable.
    public static synchronized ScannerUI getInstance() {
        if (instance == null || !instance.isDisplayable()) {
            instance = new ScannerUI();
        }
        return instance;
    }
}

更新

要访问单例对象,您需要调用其公共访问器方法并像其他对象一样使用它。

ScannerUI scanUI = ScannerUI.getInstance();
scanUI.setVisible(true);
scanUI.dispose();
etc.

更新

您当然可以将私有构造函数实现为您现在的构造函数,您应该确保构造函数在此类之外不可见,因为这会违反单例的概念。

“没做什么。” 只是一个占位符,因为我不知道您的实际构造函数是什么样的。

于 2013-11-03T19:28:36.463 回答
-1

如果你想重用 的单个实例ScannerUI,那么永远不要调用它的构造函数;而是提供工厂方法,该方法将创建一个实例并将其保存在静态变量中。基本思路:

static ScannerUI instance;

ScannerUI newScanner() {
   return instance == null || instance.isDisposed()? 
      instance = new ScannerUI() : instance;
}
于 2013-11-03T18:58:39.843 回答