java - 使用键盘箭头在网格面板内移动 JButton

标签 java swing animation jbutton keylistener

我想制作一个可以在网格面板内使用键盘箭头移动的 JButton。关于如何实现这一点有什么想法吗?

这是我到目前为止所做的,但它并没有真正起作用

button.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
            }

            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                System.out.println("KEY ^$$#$#$@#$  " + key);
                int position = 0;
                int previousPosition = 0;
                int counter = 0;

                position = Integer.parseInt(button.getName());
                int nextPosition = position;
                if (key == KeyEvent.VK_LEFT) {



                    nextPosition = nextPosition - 1;
                    previousPosition = position;
                    System.out.println("PREVIOUS POSITION: " + position);
                    bt[1].setVisible(false);
                    System.out.println("POSITION: " + position);
                    button.setName("" + nextPosition);
                    bt[nextPosition].add(button);
                }
                else if (key == KeyEvent.VK_DOWN) {
                    counter++;
                    if (counter == 1) {
                         nextPosition = nextPosition + 6;
                    }
                    else if (counter == 2) {
                         nextPosition = nextPosition + 12;
                    }
                    else {
                        nextPosition = 18;
                    }
                    System.out.println("next position:" + nextPosition);
                    System.out.println("counter: " + counter);
                    System.out.println("DOWN ARROW");

                    System.out.println("DOWN ARROW");
                    System.out.println("POSITION VALUE: " + nextPosition);
                    bt[previousPosition].setVisible(false);
                    System.out.println("POSITION: " + nextPosition);
                    button.setName("" + nextPosition);
                    bt[nextPosition].add(button);
                    System.out.println("end");
                }
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
    });

感谢您的帮助

最佳答案

嗯,这要看情况。

但是,我建议使用 Key Bindings优于 KeyListener,因为它不会遇到焦点问题。

这基本上使用了 GridLayout 并简单地更改了按钮的 z 顺序...

您可以使用 GridBagLayout 实现类似的功能,但需要做更多的工作,但这会带来更灵活的布局

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class MoveButtons {

    public static void main(String[] args) {
        new MoveButtons();
    }

    public MoveButtons() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private JButton button;

        public TestPane() {
            setLayout(new GridLayout(4, 4));
            button = new JButton("...");
            add(button);
            for (int index = 0; index < (4 * 4) - 1; index++) {
                JPanel panel = new JPanel();
                panel.setBorder(new LineBorder(Color.GRAY));
                add(panel);
            }

            requestFocus();

            InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
            ActionMap am = getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");

            am.put("left", new MoveAction(-1));
            am.put("right", new MoveAction(1));
            am.put("down", new MoveAction(4));
            am.put("up", new MoveAction(-4));
        }

        public class MoveAction extends AbstractAction {

            private int delta;

            public MoveAction(int delta) {
                this.delta = delta;
            }

            @Override
            public void actionPerformed(ActionEvent e) {
                int index = getComponentZOrder(button);
                index += delta;
                if (index < 0) {
                    index = 0;
                } else if (index >= getComponentCount()) {
                    index  = getComponentCount() - 1;
                }
                setComponentZOrder(button, index);
                revalidate();
            }
        }
    }
}

关于java - 使用键盘箭头在网格面板内移动 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834765/

相关文章:

Java 弹跳球

java - JTextArea 未附加到 swing GUI 中

java - 刷新 JTable 的 setCellEditor

javascript - CSS、JavaScript、HTML,如何将 div 内的文本与图像旁边的中间对齐?并为文字添加动画

javascript - 页面上具有多个动画的 Web 浏览器绘制率

java - EJB 与 CDI bean 中套接字客户端的最佳实践

java - 如何在 Groovy 中设置最后一个字段

java - 文档中的单词计数频率

java - 在 Netbeans/Java Swing 下,如何以 GTK+ 外观运行程序?

android - 如何在android中实现这种折叠效果?