java - 如何只打开一次内部框架

标签 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();
        }
    }
}

最佳答案

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

}

关于java - 如何只打开一次内部框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23819008/

相关文章:

java - Eclipse 风格的选项卡式 Pane ——选项卡太多时的 "Show List"按钮

java.awt.Frame.setBackground(Color arg0) 不显示粉红色

jquery ui 异步ajax 请求设置为 false 会导致问题

java - "paint"类似网页内的控件

java - 为什么我们在阿姆斯壮程序中写n/=10?

java - 以编程方式更改 java keystore 的密码

java - 来自 jsonobject 的 getstring 的 settext 显示 ' 而不是 '

java - 获取 HeadlessException : No X11 DISPLAY variable was set

适用于大型项目的 Java GUI 架构

java - 如何解决错误 java.io.IOException : Input/output error in nativeavailable for Serial Communication?