如何只打开一次内部框架

时间:2014-05-23 00:03:07

标签: java swing user-interface

单击按钮时,以下代码将打开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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

基本上,您只需要检查frame是否为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);
            }
        });
    }

}