我有一个问题,我必须使用两个 JFrame
s、 所以我们可以忘记好的/坏的做法。
当我们过了这一关。
我的两个 JFrame
s是
LoginFrame MainFrame
我想退出 MainFrame
至 LoginFrame
反之亦然。这样做,我希望两个框架都能重新打开。就像我们如何示例化它们,即。
大型机.class
//on signout button event
new LoginFrame().setVisible(true);
dispose(); //it will dispose this frame and destroy its UI components and free resources etc etc.
同样地,
loginframe.class类
//on signin button event
new MainFrame().setVisible(true);
dispose(); //it will dispose this frame and destroy its UI components and free resources etc etc.
现在,这是工作得很好,但问题是,我有一个 keyDispatchEvent
在 MainFrame
在注销后执行多次登录(不关闭应用程序)。
我相信即使在处理之后 JFrame
它实际上没有被处理。因此,当我键入任何快捷键时,先前处理的帧对象和 MainFrame
都在分发他们的活动。我怎样才能丢失(我的意思是真正地处置)所有以前的对象,以便只为当前对象触发此事件?
大型机.class
final static KeyboardFocusManager keyManager=KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyManager.addKeyEventDispatcher(new KeyEventDispatcher()
{
@Override
public boolean dispatchKeyEvent(KeyEvent e)
{
// if key is alt+r
{
signout(); // getting called repeatedly on single key release
}
}
});
我不想使用相同的对象,因为它们将具有以前的状态/信息/更改。只是想摆脱被丢弃的物体。
另外,我还要和 KeyboardManager
至 DispatchKeyEvent
在这种情况下。
1条答案
按热度按时间lg40wkob1#
我希望下面的代码符合你的要求。既然你没有发布一个最小的,可复制的例子,我只能从你的[糟糕的]问题描述和你对[你的]道路或高速公路的坚持中猜出你想要什么。
问题是我有一个
keyDispatchEvent
在MainFrame
在注销后执行多次登录我猜你一直在添加相同的
KeyEventDispatcher
到KeyboardFocusManager
每一个被添加的都会执行。所以如果你加上同样的KeyEventDispatcher
三次,它将执行三次。我假设您只想添加一次,因此需要在不再需要时删除它。我还假设在启动应用程序时
LoginFrame
首先显示。因此我添加了一个main
方法到类LoginFrame
,下方。班级
LoginFrame
```import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class LoginFrame extends JFrame implements ActionListener {
}
笔记:
我不知道为什么,但每次我在键盘上按alt+r时,事件调度器就会触发两次。因此
done
旗帜。