如何检查JFrame是否打开,通过检查它是否可见其中一个组件

时间:2017-07-02 05:45:36

标签: java swing jframe jdialog

我将此代码示例放在单独的jDialogjDialogJFrame相同的包中),用于检查(使用Thread)if jCheckBox1中的jFrame是否可见。点击JDialog中的JLabel更改密码),即可显示JFrame。即使我点击更改密码 JFrame,我也没有将false的可见性设置为JLabel

我遇到的问题是即使JFrame 不可见,即我单独运行JDialog时(不点击更改密码 JLabel)它打印“可见”,我更确定jFrame不可见且未运行。

这是我用来检查Thread的{​​{1}}的可见性的代码段(JFrame):

jCheckBox1

这是我用LockOptions lock = new LockOptions(); private void setLocation2() { new Thread() { public void run() { boolean running = true; while (running) { try { Thread.sleep(1000); if (lock.jCheckBox1.isVisible()) { System.out.println("Visible"); } else { System.out.println("Not Visible"); } } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } 更改密码 JFrame编写的代码:

JLabel

但是当我单独运行private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) { Container c = new ChangePassword(this, rootPaneCheckingEnabled); if (!c.isShowing()) { c.setVisible(true); hideMeToSystemTray(); this.requestFocusInWindow(); } } 时(不点击更改密码 JDialog),它会打印“可见”

我附上了JLabelJFrame

的屏幕截图

JDialog包含JFrame JFrame

jCheckBox1

JDialog

1 个答案:

答案 0 :(得分:0)

好的,让我们有最简单的例子。

以下代码创建一个主框架,其中包含一个按钮,用于创建类LockOptionsWindow的新框架,该框架扩展JFrame

班级FrameDemo实施Runnable。因此,可以使用Swing's Threading Policy中提到的SwingUtilities.invokeLater在事件调度线程上访问它。因此可以创建一个新的线程checklockoptionswindow,然后可以检查按钮创建的新窗口是可见还是不可见。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class FrameDemo extends WindowAdapter implements ActionListener, Runnable {

    private LockOptionsWindow lockoptionswindow;
    private Thread checklockoptionswindow = new Thread();

    private void showLockOptionsWindow() {
        if (lockoptionswindow != null && lockoptionswindow.isDisplayable()) {
            lockoptionswindow.setVisible(true);
            lockoptionswindow.setExtendedState(Frame.NORMAL);
        } else {
            lockoptionswindow = new LockOptionsWindow();
            lockoptionswindow.setSize(new Dimension(300, 100));
            lockoptionswindow.setVisible(true);
            lockoptionswindow.setExtendedState(Frame.NORMAL);
        }
    }

    private void startCheckLockOptionsWindow() {
        if (!checklockoptionswindow.isAlive()) {
            checklockoptionswindow = new Thread() {
                public void run() {
                    boolean running = true;
                    while (running) {
                        try {
                            Thread.sleep(1000);
                            if (lockoptionswindow.isVisible()) {
                                if (lockoptionswindow.getExtendedState() == Frame.ICONIFIED) {
                                    System.out.println("Visible iconified");
                                } else  {
                                    System.out.print("Visible on screen ");
                                    int x = lockoptionswindow.getLocation().x;
                                    int y = lockoptionswindow.getLocation().y;
                                    System.out.println("at position " + x + ", " + y);
                                }
                            } else {
                                System.out.println("Not Visible");
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            checklockoptionswindow.start();
        }
    }

    public void actionPerformed(ActionEvent e) {
        showLockOptionsWindow();
        startCheckLockOptionsWindow();
    }

    public void run() {
        JFrame frame = new JFrame("FrameDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JButton button = new JButton("Show LockOptions frame");
        button.addActionListener(this);
        Container contentPane = frame.getContentPane();
        contentPane.add(button);

        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new FrameDemo());
    }

    class LockOptionsWindow extends JFrame {
        public LockOptionsWindow() {
            super("LockOptions frame");
            setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        }
    }
}

编辑以确定LockOptionsWindow是仅显示图标化还是在屏幕上显示为窗口。