2017-07-02 106 views
0

我在單獨的jDialogjDialog處於與JFrame相同的包中)中使用此代碼示例來檢查(使用Thread)如果jFrame中的jCheckBox1是否可見。 JDialog設置爲可見,請在JFrame中點擊JLabel更改密碼)。即使在點擊更改密碼JLabel後,我仍未將JFrame的可見性設置爲false如何通過檢查其中一個組件是否可見來檢查JFrame是否打開

我遇到的問題是,即使JFrame不可見即當我運行JDialog單獨(無點擊更改密碼JLabel)它打印「可見」,我更確保jFrame不可見並且未運行。

這是我用來檢查的JFrame知名度的代碼片段(Thread)的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的屏幕截圖和JDialog

JFrame含有jCheckBox1 JFrame

JDialog

JDialog

+0

[java.awt.Component.isVisible](https://docs.oracle.com/javase/8/docs/api/java/awt/Component。HTML#isVisible--):「確定當它的父是可見的組件是否應該可見組件初始可見的,與頂層組分如框對象的例外。」。那麼爲什麼不檢查框架的可見性呢?你的代碼中有什麼'LockOptions'? –

+0

@AxelRichter:LockOptions是'JFrame'的類名。你能給我舉個例子嗎? – CodingBeginner

+0

即使我檢查的知名度'JFrame'它說**不可見**甚至是** **可見 – CodingBeginner

回答

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是否僅可見圖標化或者確實顯示爲屏幕上的窗口。