从监听器中修改一个JFrame [英] Modifying a JFrame from within a Listener

查看:242
本文介绍了从监听器中修改一个JFrame的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复:结果
  <一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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆