2012-12-20 4 views
5

Mögliche Duplizieren Ändern:
How to call setUndecorated() after a frame is made visible?ein JFrame aus einem Zuhörer

Wie soll ich ein JFrame undecorated sein, wenn unkonzentriert und wenn fokussiert dekoriert?

Hier ist mein Code:

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

public class Test extends JFrame 
{ 
    public Test() 
    { 
     setSize(100, 50); 
     addWindowFocusListener(new WindowAdapter() 
     { 
      public void windowGainedFocus(WindowEvent e) 
      { 
       setUndecorated(false); 
       System.out.println("Hi!"); 
      } 
      public void windowLostFocus(WindowEvent e) 
      { 
       setUndecorated(true); 
       System.out.println("Bye!"); 
      } 
     }); 
    } 

    public static void main(String[] args) 
    { 
     new Test().setVisible(true); 
    } 
} 

Und hier ist das Problem, wenn laufen und wann immer fokussiert/unfokussiert:

Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is displayable. 
    at java.awt.Frame.setUndecorated(Frame.java:825) 
    at Test$1.windowGainedFocus(Test.java:13) 
    at java.awt.Window.processWindowFocusEvent(Window.java:1952) 
    at java.awt.Window.processEvent(Window.java:1867) 
    at java.awt.Component.dispatchEventImpl(Component.java:4750) 
    at java.awt.Container.dispatchEventImpl(Container.java:2103) 
    at java.awt.Window.dispatchEventImpl(Window.java:2518) 
    at java.awt.Component.dispatchEvent(Component.java:4576) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:965) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:412) 
    at java.awt.Component.dispatchEventImpl(Component.java:4620) 
    at java.awt.Container.dispatchEventImpl(Container.java:2103) 
    at java.awt.Window.dispatchEventImpl(Window.java:2518) 
    at java.awt.Component.dispatchEvent(Component.java:4576) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672) 
    at java.awt.EventQueue.access$400(EventQueue.java:96) 
    at java.awt.EventQueue$2.run(EventQueue.java:631) 
    at java.awt.EventQueue$2.run(EventQueue.java:629) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
    at java.awt.EventQueue$3.run(EventQueue.java:645) 
    at java.awt.EventQueue$3.run(EventQueue.java:643) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642) 
    at java.awt.SequencedEvent.dispatch(SequencedEvent.java:113) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:670) 
    at java.awt.EventQueue.access$400(EventQueue.java:96) 
    at java.awt.EventQueue$2.run(EventQueue.java:631) 
    at java.awt.EventQueue$2.run(EventQueue.java:629) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
    at java.awt.EventQueue$3.run(EventQueue.java:645) 
    at java.awt.EventQueue$3.run(EventQueue.java:643) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is displayable. 
    at java.awt.Frame.setUndecorated(Frame.java:825) 
    at Test$1.windowLostFocus(Test.java:18) 
    at java.awt.Window.processWindowFocusEvent(Window.java:1955) 
    at java.awt.Window.processEvent(Window.java:1867) 
    at java.awt.Component.dispatchEventImpl(Component.java:4750) 
    at java.awt.Container.dispatchEventImpl(Container.java:2103) 
    at java.awt.Window.dispatchEventImpl(Window.java:2518) 
    at java.awt.Component.dispatchEvent(Component.java:4576) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1895) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:965) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:712) 
    at java.awt.Component.dispatchEventImpl(Component.java:4620) 
    at java.awt.Container.dispatchEventImpl(Container.java:2103) 
    at java.awt.Window.dispatchEventImpl(Window.java:2518) 
    at java.awt.Component.dispatchEvent(Component.java:4576) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672) 
    at java.awt.EventQueue.access$400(EventQueue.java:96) 
    at java.awt.EventQueue$2.run(EventQueue.java:631) 
    at java.awt.EventQueue$2.run(EventQueue.java:629) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
    at java.awt.EventQueue$3.run(EventQueue.java:645) 
    at java.awt.EventQueue$3.run(EventQueue.java:643) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642) 
    at java.awt.SequencedEvent.dispatch(SequencedEvent.java:113) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:670) 
    at java.awt.EventQueue.access$400(EventQueue.java:96) 
    at java.awt.EventQueue$2.run(EventQueue.java:631) 
    at java.awt.EventQueue$2.run(EventQueue.java:629) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116) 
    at java.awt.EventQueue$3.run(EventQueue.java:645) 
    at java.awt.EventQueue$3.run(EventQueue.java:643) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:642) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138) 

ein newb Verzeih, ich bin sicher, dass es einige grundlegende Konzept, das ich vermisst habe hier, und das würde ich am liebsten wissen.

+1

See [ 'setUndecorated()'] (http://docs.oracle.com/javase/7/docs/api /java/awt/Frame.html#setUndcorated(boolean%29). – trashgod

Antwort

8

+1 bis @AaronKurtzhals und @trashgods Kommentare für den Link, der die Ideen unter

Hier gab ein kurzes Beispiel, das ich Ihnen helfen gemacht.

Lösung:

1) rufen dispose() auf JFrame Instanz Ressourcen freizugeben

2) bearbeiten Frame-Instanz nach Bedarf d.h setUndecorated(..)

3) Rufen Sie pack() und setVisible(true) auf JFrame.

wenn fokussiert/Maus über (wie beim setUndecorated(true) heißt wir können für Fokus-Ereignisse nicht hören):

enter image description here

wenn nicht fokussiert:

enter image description here

import java.awt.Dimension; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionAdapter; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class Test { 

    private boolean firstTime2 = true; 
    private boolean firstTime = true; 
    private JFrame frame; 
    private JLabel focusLabel=new JLabel(""); 

    public Test() { 
     initComponents(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    private void initComponents() { 
     initFrame(); 
     frame.addMouseMotionListener(new MouseMotionAdapter() { 
      @Override 
      public void mouseMoved(MouseEvent me) { 
       super.mouseMoved(me); 
       firstTime2 = false; 
       firstTime = false; 
       if (frame.isUndecorated()) { 
        focusLabel.setText("Focused"); 
        firstTime = true; 
        firstTime2 = true; 
        frame.dispose(); 
        frame.setUndecorated(false); 
        showFrame(); 
       } 
      } 
     }); 

     frame.addWindowFocusListener(new WindowAdapter() { 
      @Override 
      public void windowGainedFocus(WindowEvent e) { 
       if (firstTime) { 
        focusLabel.setText("Focused"); 
        firstTime = false; 
        frame.dispose(); 
        frame.setUndecorated(false); 
        showFrame(); 
       } 
      } 

      @Override 
      public void windowLostFocus(WindowEvent e) { 
       if (!firstTime2) { 
        focusLabel.setText("Not focused"); 
        frame.dispose(); 
        frame.setUndecorated(true); 
        showFrame(); 
       } 
       firstTime2 = false; 
      } 
     }); 

     showFrame(); 
    } 

    private void initFrame() { 
     frame = new JFrame() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(300, 300); 
      } 
     }; 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(focusLabel); 
    } 

    private void showFrame() { 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Einige Tipps Sie haben vielleicht bemerkt:

  • Dont verlängern JFrame unnötig
  • Verwenden Event Dispatch Thread zum Erstellen und Bearbeiten Swing-Komponenten
+0

Danke, ich habe ein paar Stunden gebraucht, um wirklich mit all dem herumzuspielen, aber ich kann nicht herausfinden, warum ich nicht mit anderen Anwendungen per Tastatur interagieren kann, ohne schnell auf die andere App zu klicken. – werdnanoslen