我将此代码示例放在单独的jDialog
(jDialog
与JFrame
相同的包中),用于检查(使用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
),它会打印“可见”
我附上了JLabel
和JFrame
jCheckBox1
:
答案 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是仅显示图标化还是在屏幕上显示为窗口。