gpt4 book ai didi

java - KeyListener/KeyBindings 以及添加组件的顺序

转载 作者:行者123 更新时间:2023-12-02 11:04:32 26 4
gpt4 key购买 nike

在我的程序中,由使用 KeyBindings 的监听器操作的 JPanel 组件(在阅读有关聚焦问题后已经从 KeyListeners 更改)被添加到 JFrame 中。这个应用程序的任务是简单地使用箭头键移动绘制的图形。直到我在绘图板之前添加另一个组件(带有三个按钮的 JPanel)之前,这一切都很好。我测试了 Keybindings 和 KeyListener,这两种方法都有相同的问题。如果我在绘图板键绑定(bind)后添加组件,则再次开始工作。

这是我添加组件的 UI 类。

EDIT: removed uncleaned code

我想更多地了解 Java,所以非常感谢任何答案。

<小时/>

编辑:我清理了代码并创建了问题的“最小”示例。谢谢安德鲁的提醒。

按向上箭头后,程序应在控制台中打印“movingup”。

问题出现在这里:

container.add(buttons); //after adding this Key Bindings stops working
container.add(board);

问题是:为什么添加组件的顺序会使按键绑定(bind)停止工作?如果我在按键绑定(bind)工作后添加按钮

有问题的类(用于创建框架和添加组件)

import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.KeyStroke;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.WindowConstants;


public class UserInterface implements Runnable {

private static final String MOVE_UP = "moveUP";

private JFrame frame;

public UserInterface() {
}

@Override
public void run() {
frame = new JFrame("Board");

frame.setPreferredSize(new Dimension(500, 400));
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout());

createComponents(frame.getContentPane());

frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);


}

private void createComponents(Container container) {

DrawingBoard board = new DrawingBoard();

container.add(new JButton()); //after adding this figure stops moving - arrow keys doesn't work
container.add(board);

MovingUpwards up = new MovingUpwards(board);

board.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
board.getInputMap().put(KeyStroke.getKeyStroke("UP"), MOVE_UP);

board.getActionMap().put(MOVE_UP, up);


}

public JFrame getFrame() {
return frame;
}

}

用于测试目的的其余使用的类:

import javax.swing.SwingUtilities;

public class Main {

public static void main (String[] args) {
UserInterface ui = new UserInterface();
SwingUtilities.invokeLater(ui);
}
}



import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawingBoard extends JPanel {

public DrawingBoard() {
super.setBackground(Color.WHITE);
}

@Override
protected void paintComponent (Graphics graphics) {
super.paintComponent(graphics);
}

}


import java.awt.Component;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;

public class MovingUpwards extends AbstractAction {

private Component component;

public MovingUpwards(Component component) {
this.component = component;
}

@Override
public void actionPerformed(ActionEvent a) {
System.out.println("movingup");
}

}

最佳答案

按键绑定(bind)对我来说效果很好。查看 Motion Using the Keyboard 中的 Motion using Key Bindings 示例.

我更改了代码:

frame.add( content );
frame.add(left, BorderLayout.NORTH);

至:

frame.setLayout(new GridLayout());
frame.add(left);
frame.add( content );

更好地模拟您的逻辑。

如果您需要更多帮助,请阅读上面安德鲁的评论。简化您的代码以演示问题,以便我们可以通过复制和编译单个源文件来“轻松”测试它,您可以通过上面的链接测试代码。

关于java - KeyListener/KeyBindings 以及添加组件的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51083562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com