Java 如何通过检查JFrame';s其中一个组件是可见的

Java 如何通过检查JFrame';s其中一个组件是可见的,java,swing,jframe,jdialog,Java,Swing,Jframe,Jdialog,我在一个单独的jDialog(jDialog与JFrame在同一个包中)中有这个代码示例,用于检查JFrame中的jCheckBox1是否可见JDialog设置为可见。我没有将JFrame的可见性设置为false,即使在我单击更改密码之后 我遇到的问题是,即使JFrame不可见,也就是说,当我单独运行JDialog时(没有单击更改密码JLabel),它也会打印“可见”而且我非常确定jFrame不可见且不运行 这是我用来检查JFrame的jCheckBox1可见性的代码片段(Thread): Lo

我在一个单独的
jDialog
jDialog
JFrame
在同一个包中)中有这个代码示例,用于检查
JFrame
中的
jCheckBox1
是否可见<通过单击
JFrame
中的
JLabel
更改密码)将code>JDialog设置为可见。我没有将
JFrame
的可见性设置为
false
,即使在我单击更改密码之后

我遇到的问题是,即使
JFrame
不可见
,也就是说,当我单独运行
JDialog
时(没有单击更改密码
JLabel
),它也会打印“可见”而且我非常确定
jFrame
不可见且不运行

这是我用来检查
JFrame
jCheckBox1
可见性的代码片段(
Thread
):

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
时(不点击更改密码
JLabel
),它会打印“可见”

我附上了
JFrame
JDialog

JFrame
包含
jCheckBox1

JDialog


好的,让我们举一个最简单的例子

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

FrameDemo
实现
Runnable
。因此,可以使用中提到的
SwingUtilities.invokeLater
在事件调度线程上访问它。因此,可以创建一个新线程
CheckLockOptions window
,然后可以检查按钮创建的新窗口是否可见

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);
        }
    }
}

编辑以确定LockOptions窗口是否仅显示为图标化窗口,还是真正显示为屏幕上的窗口。

好的,让我们看一个最简单的示例

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

FrameDemo
实现
Runnable
。因此,可以使用中提到的
SwingUtilities.invokeLater
在事件调度线程上访问它。因此,可以创建一个新线程
CheckLockOptions window
,然后可以检查按钮创建的新窗口是否可见

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);
        }
    }
}

编辑以确定LockOptions窗口是否仅以图标形式显示或在屏幕上真正显示为窗口。

:“确定当其父组件可见时此组件是否应可见。组件最初可见,但顶层组件(如框架对象)除外。”。那么,为什么不自己检查框架的可见性呢?您的代码中的
LockOptions
是什么?@AxelRichter:LockOptions是
JFrame
的类名。你能给我举个例子吗?即使我检查了
JFrame
的可见性,它说不可见,即使它可见即使
JFrame
正在显示,
JDialog
中的
线程
正在打印“不可见”:“确定当其父组件可见时,此组件是否应可见。组件最初是可见的,但顶层组件(如框架对象)除外。“。那为什么不自己检查框架的可见性呢?您的代码中的
LockOptions
是什么?@AxelRichter:LockOptions是
JFrame
的类名。你能给我举个例子吗?即使我检查了
JFrame
的可见性,它说不可见,即使它可见即使
JFrame
正在显示,
JDialog
中的
线程
正在打印“不可见”