2012-12-20 10 views
5

Powiel możliwe:
How to call setUndecorated() after a frame is made visible?Modyfikowanie JFrame od wewnątrz słuchacza

jaki sposób należy dokonać JFrame być undecorated kiedy zogniskowany i urządzone kiedy skupia?

Oto mój kod:

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

I tu jest problem podczas uruchamiania i gdy skupia/nieostry:

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) 

wybaczyć NEWB, jestem pewien, że istnieje jakaś zasadnicza koncepcja mi brakuje tutaj i chciałbym to wiedzieć najbardziej.

+1

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

Odpowiedz

8

+1 do @AaronKurtzhals i @trashgods komentarzy na link, który dał pomysły poniżej

Oto krótki przykład zrobiłem ci pomóc.

Rozwiązanie:

1) nazywamy dispose() na JFrame przykład, aby zwolnić zasoby

2) instancji edycja ramki jako potrzebne tj setUndecorated(..)

3) Zadzwoń pack() i setVisible(true) na JFrame.

gdy koncentruje/Najedź (jak podczas setUndecorated(true) nazywa nie możemy słuchać wydarzeń focus):

enter image description here

gdy nie skupia:

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

kilka wskazówek być może zauważyłeś:

  • Do not rozciągają JFrame niepotrzebnie
  • Zastosowanie Event Dispatch Thread tworzenie i manipulowania elementy piłowania
+0

Dzięki, zajęło mi kilka godzin, aby naprawdę się z tym bawić, ale nie mogę zrozumieć, dlaczego nie mogę interakcji z innymi aplikacjami za pomocą klawiatury bez szybkiego klikania drugiej aplikacji. – werdnanoslen