3 Stimmen

KeyListener auf zweidimensionalem JPanel [][] Tabelle

Ich habe eine zweidimensionale JPanel-Tabelle erstellt und habe einen JButton in meiner ersten Zelle. Ich möchte den Button mit meinen Pfeiltasten innerhalb der Grenzen meiner Tabelle bewegen. Muss ich den KeyListener in jeder Zelle oder auf meinem Button setzen? Vielleicht findest du meine Frage dumm, aber ich brauche ein wenig Hilfe mit dem KeyListener. Danke!! Hier ist, was ich erstellen muss

Hier ist der Code, den ich geschrieben habe!

public class MyFrame extends JFrame {

JPanel [][] innerCells;

public MyFrame() {
    JFrame fr = new JFrame("Final Exams");
    fr.setSize(800, 600);

    fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    fr.setVisible(true);
    fr.setLocationRelativeTo(null);

    JPanel p = new JPanel(new GridLayout(10, 10));
    JButton b = new JButton("G");
    innerCells = new JPanel[10][10];

    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            innerCells[i][j] = new JPanel();
            innerCells[i][j].setBorder(BorderFactory.createLineBorder(Color.orange));
            p.add(innerCells[i][j]);
        }
    }
    innerCells[0][0].add(b);
    fr.add(p);

}

1voto

user Punkte 211

Fügen Sie dem Button einen Keylistener hinzu (es wäre besser, mit KeyBindings zu arbeiten).

Erstellen Sie zwei int-Variablen für die Indizes des aktuellen Panels (z.B. x, y).

Im Methode keyPressed(KeyEvent e) entfernen Sie den Button aus dem aktuellen Panel und fügen Sie ihn dem neuen Panel hinzu.

Hinweis: Der Button muss den Fokus haben, wenn Sie ihn mit den Tasten verschieben möchten.

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JFrame {

    private JPanel [][] innerCells;
    private JButton b = new JButton("G");
    private int x=0;
    private int y=0;
    private final int size=10;

    public MyFrame() {
        JFrame fr = new JFrame("Abschlussprüfungen");
        fr.setSize(800, 600);

        fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr.setVisible(true);
        fr.setLocationRelativeTo(null);

        JPanel p = new JPanel(new GridLayout(size, size));

        innerCells = new JPanel[size][size];

        for(int i=0;i

0voto

Leute, ich habe es endlich geschafft, dieses Problem zu lösen! Hier ist die Lösung.. Ich habe es mit KeyListener gemacht, aber ich denke, wie @MadProgrammer sagt, mit Tastenbindungen ist es einfacher!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Askhsh6 {

    int gr, st;
    Dimension dim;

    public Askhsh6() {
        final JFrame fr1 = new JFrame("Ein Titel");
        fr1.setSize(800, 600);
        fr1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fr1.setVisible(true);
        fr1.setResizable(false);

        final JButton b = new JButton("G");
        dim = new Dimension(70, 50);
        b.setSize(dim);
        b.setFocusable(false);
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                b.validate();
                b.repaint();
                boolean pop = b.isFocusOwner();

                pop = b.isFocusOwner();
                System.out.println("" + pop);
            }
        });
        final JPanel[][] p;
        JPanel p1 = new JPanel();
        p1.setLayout(new GridLayout(8, 6));

        p = new JPanel[8][6];

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 6; j++) {
                p[i][j] = new JPanel();
                p[i][j].setLayout(new BorderLayout());

                p[i][j].setBorder(BorderFactory.createLineBorder(Color.ORANGE));
                p1.add(p[i][j]);

            }
        }
        p[0][0].add(b, BorderLayout.CENTER);
        gr = st = 0;

        fr1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent ke) {
                if (ke.getKeyCode() == KeyEvent.VK_DOWN) {
                    System.out.println("UNTER");
                    if (gr + 1 < 8) {
                        p[gr][st].remove(b);
                        gr = gr + 1;
                        p[gr][st].add(b, BorderLayout.CENTER);

                        fr1.repaint();
                    }
                }
                if (ke.getKeyCode() == KeyEvent.VK_UP) {
                    System.out.println("OBEN");
                    if (gr - 1 >= 0) {
                        p[gr][st].remove(b);
                        gr = gr - 1;
                        p[gr][st].add(b, BorderLayout.CENTER);

                        fr1.repaint();
                    }
                }
                if (ke.getKeyCode() == KeyEvent.VK_LEFT) {
                    System.out.println("LINKS");
                    if (st - 1 >= 0) {
                        p[gr][st].remove(b);
                        st = st - 1;
                        p[gr][st].add(b, BorderLayout.CENTER);

                        fr1.repaint();
                    }
                }
                if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {
                    System.out.println("RECHTS");
                    if (st + 1 < 6) {
                        p[gr][st].remove(b);
                        st = st + 1;
                        p[gr][st].add(b, BorderLayout.CENTER);

                        fr1.repaint();
                    }
                }
            }
        });
        fr1.add(p1);
        fr1.validate();
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X