在JavaSwing中使用单例

在JavaSwing中使用单例,java,swing,singleton,Java,Swing,Singleton,我使用单例模式时会这样想。我不想要严肃的方法、类或任何东西。我来看看这是什么 private void btnVehicleActionPerformed(java.awt.event.ActionEvent evt) {} 这是jButtonbtnHicle的我的事件->操作->执行的操作。当我按下按钮时,一个InternalFrame表单被加载到jDesktopPane。当我按下两次时,两个表单被加载。如果我可以使用Singleton,最好的解决方案是加载单个帧,如果已经加载,则将帧放在前

我使用单例模式时会这样想。我不想要严肃的方法、类或任何东西。我来看看这是什么

private void btnVehicleActionPerformed(java.awt.event.ActionEvent evt) {}
这是jButtonbtnHicle的我的事件->操作->执行的操作。当我按下按钮时,一个InternalFrame表单被加载到jDesktopPane。当我按下两次时,两个表单被加载。如果我可以使用Singleton,最好的解决方案是加载单个帧,如果已经加载,则将帧放在前面。我试过了,实际上没用,按一下按钮

Registration_Vehicles rv;
private void btnVehicleActionPerformed(java.awt.event.ActionEvent evt) { 

    if(rv==null){
        rv = new Registration_Vehicles();
        jDesktopPane2.add(rv);
    }        
    else{
    rv.toFront();
    }
}

任何人都可以通过singleton或其他任何方式对此提供更好的解决方案。

这里有一个小程序,可以选择现有的内部帧或创建一个新帧(取决于用户指定的帧号是否已经存在):


这里有一个关于
JDesktopPane
JInternalFrame
s的不错的教程:。

我不认为你所描述的是singlton。您可能有一个与
JDesktop
关联的“工厂”,该工厂维护有关它在
JDesktop
中创建/存在的窗口的信息,例如,当您想要创建窗口时,您将把所需的信息传递给工厂,工厂将根据它所知道的内容(创建/重用)传回一个
JInternalFrame
的实例
import java.awt.FlowLayout;
import java.beans.PropertyVetoException;
import javax.swing.*;

public class SingletonInSwing {
    private JDesktopPane desktopPane;
    private JTextField frameNumberTextField;

    public static void main(final String[] arguments) {
        new SingletonInSwing().launchGui();
    }

    private void launchGui() {
        final JFrame frame = new JFrame("Stack Overflow");
        frame.setBounds(100, 100, 800, 600);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        desktopPane = new JDesktopPane();
        desktopPane.add(createControlPanel());

        // Add one internal frame to get started.
        addInternalFrame("1");

        frame.setContentPane(desktopPane);
        frame.setVisible(true);
    }

    private JInternalFrame createControlPanel() {
        final JPanel controlPanel = new JPanel(new FlowLayout());
        frameNumberTextField = new JTextField(6);
        final JButton addFrameButton = new JButton("Add internal frame");
        controlPanel.add(new JLabel("Frame number:"));
        controlPanel.add(frameNumberTextField);
        controlPanel.add(addFrameButton);

        frameNumberTextField.addActionListener(actionEvent -> addInternalFrame());
        addFrameButton.addActionListener(actionEvent -> addInternalFrame());

        final JInternalFrame controlFrame = new JInternalFrame("Control frame");
        controlFrame.add(controlPanel);
        controlFrame.setBounds(10, 10, 760, 90);
        controlFrame.setVisible(true);

        return controlFrame;
    }

    private void addInternalFrame() {
        addInternalFrame(frameNumberTextField.getText());
    }

    private void addInternalFrame(final String frameNumber) {
        final String frameTitle = "test " + frameNumber;

        // Search for existing frame.
        JInternalFrame existingFrame = null;
        for (final JInternalFrame internalFrame : desktopPane.getAllFrames()) {
            if (frameTitle.equals(internalFrame.getTitle())) {
                existingFrame = internalFrame;
                break;
            }
        }

        // Select existing or create new frame.
        if (existingFrame != null) {
            try {
                existingFrame.setSelected(true);
            } catch (final PropertyVetoException e) {
                e.printStackTrace();
            }
        } else {
            final int frameCount = desktopPane.getAllFrames().length;
            final JInternalFrame internalFrame = new JInternalFrame(frameTitle);
            internalFrame.setBounds(20 * frameCount, 110 + 40 * frameCount, 400, 200);
            internalFrame.setVisible(true);
            desktopPane.add(internalFrame);
            internalFrame.moveToFront();
        }
    }
}