Java 如何只打开一次内部框架

Java 如何只打开一次内部框架,java,swing,user-interface,Java,Swing,User Interface,单击按钮时,以下代码将打开一个JInternalFrame。但是我希望这个窗口被打开一次,因此如果用户再次单击该按钮,它将不会打开另一个框架,而是会将窗口带到前面,无论它是否被图标化,在另一个窗口后面,等等。我尝试了几种主要使用计数器的方法,但问题是一旦框架关闭,它也不会再次打开。有没有其他简单的方法可以做到这一点,因为我无法使它正常工作。提前谢谢 以下是我正在处理的代码: public class About implements ActionListener{ private int

单击按钮时,以下代码将打开一个JInternalFrame。但是我希望这个窗口被打开一次,因此如果用户再次单击该按钮,它将不会打开另一个框架,而是会将窗口带到前面,无论它是否被图标化,在另一个窗口后面,等等。我尝试了几种主要使用计数器的方法,但问题是一旦框架关闭,它也不会再次打开。有没有其他简单的方法可以做到这一点,因为我无法使它正常工作。提前谢谢

以下是我正在处理的代码:

  public class About implements ActionListener{

private int openFrameCount;
private JDesktopPane desk;
private JTextArea Tarea;
private JScrollPane scroll;
private BufferedReader in ;
int count =0;
MyInternalFrame frame;

public About(JDesktopPane desktop) {
    // TODO Auto-generated constructor stub
    desk = desktop;
    System.out.println(count);
}

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub
    count += 1;

    if(count == 1){
    frame = new MyInternalFrame("SAD Imaging");
    count +=1;
    try {
        in = new BufferedReader(new FileReader("SADInfo.txt"));
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    String line;
    String file = ""; 
    try {
        while((line = in.readLine()) != null)
        {
            System.out.println(line);
            file += line;
            file +="\n";

        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    try {
        in.close();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    Tarea = new JTextArea();
    //System.out.println(file);

    Tarea.setText(file);
    Font f = new Font("TimesNewRoman", Font.ROMAN_BASELINE, 16);
    Tarea.setFont(f);
    Tarea.setBackground(Color.white);
    Tarea.setAlignmentX(SwingConstants.CENTER);
    Tarea.setEditable(false);

    JPanel panel = new JPanel();
    panel.add(Tarea);
    panel.setBackground(Color.white);

     //scroll = new JScrollPane(Tarea);
     scroll = new JScrollPane(panel,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    frame.add(scroll);
    frame.setVisible(true);
    desk.add(frame);

     try {
            frame.setSelected(true);
    } catch (java.beans.PropertyVetoException e) {

    }

    }
    else if(count > 1){
        try {
            //frame.setIcon(true);
            frame.setMaximum(true);
            frame.toFront();
        } catch (PropertyVetoException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

基本上,您只需检查
帧是否为
null
。如果是,则创建一个实例,如果不是,则将其放在前面

@Override
public void actionPerformed(ActionEvent arg0) {
    if (frame == null || (frame.getParent() == null && !frame.isIconifiable())) {
        // Your exitsing code
    } else {
        frame.setIcon(false);
        frame.setSelected(true);
        frame.moveToFront();
    }
您还可以对帧使用
InteralFrameListener
,以便可以检测帧何时关闭,从而
null
内部引用,例如

frame.addInternalFrameListener(new InternalFrameAdapter() {
    @Override
    public void internalFrameClosing(InternalFrameEvent e) {
        frame = null;
    }
});
使用可运行示例更新

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestInternalFrame {

    public static void main(String[] args) {
        new TestInternalFrame();
    }

    private JInternalFrame imageFrame;
    private JDesktopPane desktop;

    public TestInternalFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JMenu fileMenu = new JMenu("File");
                JMenuItem newMenu = fileMenu.add("Show...");
                newMenu.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if (imageFrame == null || imageFrame.isClosed()) {
                            imageFrame = new JInternalFrame("Image");
                            imageFrame.setIconifiable(true);
                            imageFrame.setMaximizable(true);
                            imageFrame.setClosable(true);
                            imageFrame.setResizable(true);
                            JLabel label = new JLabel(new ImageIcon("..."));
                            imageFrame.add(label);
                            imageFrame.pack();

                            desktop.add(imageFrame);


                            imageFrame.setLocation(0, 0);
                            imageFrame.setVisible(true);
                        }

                        try {
                            imageFrame.setIcon(false);
                            imageFrame.setSelected(true);
                        } catch (PropertyVetoException ex) {
                            ex.printStackTrace();
                        }
                        imageFrame.moveToFront();
                    }
                });

                desktop = new JDesktopPane();

                JMenuBar mb = new JMenuBar();
                mb.add(fileMenu);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setJMenuBar(mb);
                frame.add(desktop);
                frame.setSize(1200, 900);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}

谢谢但是当它被形象化时,我如何使它去形象化呢?这就是frame.seticonitable(false);是因为我试过了,但是它打开了一个新的框架,它并没有提出与图标化的框架相同的框架。啊,我的错,一直忘了当框架图标化后会从桌面窗格中删除,检查更新的
if
语句,看看是否效果更好。没有效果。我放置了一个内部帧侦听器,并尝试执行if(frame.setIconifiable()){internalFrameDeiconified(null)},但这似乎也没有任何作用。