我有两节课。
一个扩展canvas并在内部创建一个jframe,将canvas添加到该jframe,并添加另一个keyadapter类以接收键事件。我也有主要的函数来测试代码。当从main运行时,表单将显示并接收关键事件。
现在我创建了另一个扩展jframe并实现keylistener以接收这种形式的事件的类。
在第二个类中完成功能后,我想关闭第二个表单并显示第一个表单。当从第二个类中的键事件函数显示它时,第一个类的键侦听器不工作。
请看一下我的代码并告诉我如何纠正我的问题。感谢您的时间和宝贵的建议。
第1类
public class Test extends Canvas {
private JFrame container;
public Test() {
container = new JFrame("Space Invaders");
JPanel panel = (JPanel) container.getContentPane();
panel.setPreferredSize(new Dimension(screenSize.width, screenSize.height));
panel.setLayout(null);
setBounds(0, 0, screenSize.width, screenSize.height);
panel.add(this);
container.pack();
container.setResizable(false);
container.setVisible(true);
try {
addKeyListener(new KeyInputHandler(this));
} catch (Exception e) {
e.printStackTrace();
}
requestFocus();
}
private class KeyInputHandler extends KeyAdapter {
public void keyPressed(KeyEvent e) {
//Some Action
}
public void keyReleased(KeyEvent e) {
//Some Action
}
public void keyTyped(KeyEvent e) {
//Some Action
}
}
public static void main(String args[]){
//Running this canvas here works perfectly with all added keylisteners
}
}
public class Sample extends JFrame implements KeyListener {
public Sample() {
init();
this.setSize(100, 100);
this.setVisible(true);
Sample.this.dispose();
// Created a window here and doing some operation and finally redirecting
// to the previous test window. Even now the test window works perfectly
// with all keylisteners
new Test();
}
public static void main(String[] args) {
new Sample();
}
private void init() {
addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
removeKeyListener(this);
Sample.this.dispose();
// But when calling the previous Test window here, the window
// gets displayed but the keylistener is not added to the
// window. No keys are detected in test window.
new Test();
}
@Override
public void keyReleased(KeyEvent e) {
}
}
简单的不要使用keylistener
/keyadapter
,它用于AWT组件,并且与Swing一起使用时有已知的焦点问题。
通过setFocusable(true)
确保组件可聚焦,并在添加组件/组件可见后调用RequestFocusInWindown()
来解决这些问题。
而是使用keybinding
s进行Swing。
public static void addKeyBindings(JComponent jc) {
jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "D pressed");
jc.getActionMap().put("D pressed", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("D pressed");
}
});
jc.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "D released");
jc.getActionMap().put("D released", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("D released");
}
});
}
我们将此方法称为:
JPanel ourPanel=new JPanel();
...
addKeyBindings(ourPanel);//adds keybindings to the panel
有关守则的其他建议
>
始终通过SwingUtilities.Invokelater(Runnable r)
块在事件调度线程
上创建和操作Swing组件
我有3个不同的JFrames。一个是一个登录页面,另一个有,第三个是主页。现在我想要的是,当我们登录时,我想在登录页面上方显示,并在完成进度到100%时,我想关闭两个框架并打开第三个,这是主页。请好心帮我完成这项工作。谢谢//这是代码部分。 }//这打开我的进度条的第二个JFrame //在Progressbar页面的下一页,我有这个代码 //现在我想要的是,在进度条完成后,我想处理登录页面和只打
问题内容: 我下棋。我写了3节课。如果是游戏则为第一。(棋盘,棋子等),另外一个用于菜单。(新,打开,设置时间等按钮) 他们两个都使用JFrame。 我想将上述两个类都放在第3类中。例如,“游戏”窗口在左侧,菜单在右侧。第三类还将通过JFrame显示整个应用程序。 怎么做? 问题答案: 您不能将一个JFrame放入另一个。您在这里有几个设计选择。您可以将JFrames更改为JPanels。这可能是
问题内容: 众所周知,我是一名完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他文章,谷歌搜索,并问一个不太喜欢Java新手的朋友),但我不知道。答案可能是明确而容易的,但我对此视而不见。我正在尝试从其他框架中放置A。 我的应用程序应该按以下方式工作: 按下框架X时有一个按钮:产生框架Y 框架Y有一个按钮,当按下时:产生框架Z 按下框架Z时有一个按钮:在放置框
EDIT2:测试过了。这无疑是新JPanel的一个问题。 解决方案:正如建议的那样,答案是我忘了明确地将我的JPanel设置到JFrame上。改变: 到 这对我很管用! 我的问题是JFrame的一个奇怪行为。 在我的代码中,我的主机上有一个单选按钮。按下时,会打开另一个框架。 在我的新框架里,我做了一个JPanel。在添加JPanel之前,另一个框架没有冻结,所以我相信问题与新的JPanel有关。
很多人可能都知道,我是一个完全的Java新手。我已经尝试过对此进行研究(通过阅读StackOverflow上的其他帖子,在谷歌上搜索,并询问一位不太熟悉java的朋友),但我无法理解。答案可能很清楚也很简单,但我对此视而不见。我试图从不同的帧中处理JFrame。 我的应用程序应该按如下方式工作: 帧X有一个按钮,按下时:生成帧Y 帧Y有一个按钮,按下时:生成帧Z Frame Z有一个按钮,按下时:
问题内容: 嗨,我试图将一些文本附加到同一包中另一个类的一个小问题。以下是与JFrame有关的主要类: 我包括测试变量只是为了轻松地重新创建问题,但是无论何时运行append函数,jFrame的文本区域中都不会出现任何内容。在我的方案中,我让客户端从服务器接收文本,然后将其附加到文本框中。 顺便说一句,我正在为JFrame使用IntelliJ GUI设计器。我只包含了重新创建问题所需的代码。我仍在