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
中的线程
正在打印“不可见”