从监听器中修改一个JFrame [英] Modifying a JFrame from within a Listener
问题描述
可能重复:结果
<一href=\"http://stackoverflow.com/questions/875132/how-to-call-setundecorated-after-a-frame-is-made-visible\">How调用setUndecorated()帧变得可见后?
我应该怎样做一个JFrame被聚焦时,未修饰和聚焦时,装饰?
How should I make a JFrame be undecorated when unfocused and decorated when focused?
下面是我的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);
}
}
在运行时
和这里的问题,只要专注/聚焦:
And here's the problem when run and whenever focused/unfocused:
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)
原谅对于新手,我敢肯定有我在这里失踪的一些基本概念,我想知道最。
Forgive a newb, I'm sure there's some fundamental concept I'm missing here, and I'd like to know that the most.
推荐答案
+1 @AaronKurtzhals和@trashgods评论的链接,给了以下
+1 to @AaronKurtzhals and @trashgods comments for the link that gave the ideas below
下面是我做帮你一份简短的例子。
Here is a short example I made to help you out.
解决方案:
1)调用的Dispose()
在的JFrame
实例来释放资源
1) call dispose()
on JFrame
instance to release resources
2)根据需要,即 setUndecorated(..)
3)呼叫包()
和调用setVisible(真)
在的JFrame
。
在集中/鼠标悬停(如当 setUndecorated(真)
叫我们无法侦听焦点事件):
when focused/Mouse over (as when setUndecorated(true)
is called we cannot listen for focus events):
在没有聚焦:
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);
}
}
您可能已经注意到一些提示:
Some tips you might have noticed:
- 不要延长
的JFrame
不必要的 - 使用
事件指派线程
一>创建和操纵Swing组件
这篇关于从监听器中修改一个JFrame的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!