2013-06-05 3 views
3

Я создал таблицу JPanel с двумя измерениями, и у меня есть JButton на моей первой ячейке. Я хочу переместить кнопку с помощью клавиш со стрелками в пределах моей таблицы. Я должен поместите KeyListener в каждую ячейку или на мою кнопку? Возможно, вы найдете мой вопрос глупым, но мне нужна небольшая помощь с KeyListener. Спасибо! Here its what i have to createKeyListener на двухмерном JPanel [] [] table

Вот код, который я написал!

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); 

} 
+2

Взгляните на ** [это] (http://stackoverflow.com/questions/16834765/move-jbutton-with-keyboard-arrows-inside-a-grid-panel/16835242#16835242) **, в основном, игнорировать KeyListener и использовать [привязки клавиш] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer

+0

Большое спасибо! Я буду работать над этим, и я буду отправьте мой ответ !;) Значит, у вас нет слушателя? Почему лучше всего привязывать клавиши? –

ответ

0

Ребята, я могу решить, наконец, эту проблему! вот решение .. Я сделал это с KeyListener, но я думаю, что @MadProgrammer говорит с привязкой клавиш проще!

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("a Title"); 
     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("DOWN"); 
        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("UP"); 
        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("LEFT"); 
        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("RIGHT"); 
        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(); 
    } 
} 
1

Добавить ключ-ключ к кнопке (лучше работать с KeyBindings).

Сделайте две переменные int для индексов текущей панели (например, x, y).

В методе keyPressed (KeyEvent e) удалите кнопку с текущей панели и добавьте ее на новую панель.

Примечание: кнопка должна иметь фокус, если вы хотите переместить ее с помощью клавиш.

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("Final Exams"); 
     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<size;i++){ 
      for(int j=0;j<size;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); 

     b.addKeyListener(new KListener()); 
    } 

    private class KListener extends KeyAdapter{ 
     public void keyPressed(KeyEvent e){ 
      innerCells[x][y].remove(b); 
      innerCells[x][y].repaint(); 
      int keyCode = e.getKeyCode(); 
      switch(keyCode) { 
       case KeyEvent.VK_UP: 
        x= x-1; 
         break; 

       case KeyEvent.VK_DOWN: 
        x= (x+1)%size; 
         break; 

       case KeyEvent.VK_LEFT: 
        y= y-1; 
         break; 
       case KeyEvent.VK_RIGHT : 
        y= (y+1)%size; 
         break; 
      } 
      if(x<0) x=size-1; 
      if(y<0)y=size-1; 
      innerCells[x][y].add(b); 

      innerCells[x][y].revalidate(); 
      b.requestFocus(); 
    } 
    ´  } 

    public static void main(String[] args){ 
      MyFrame f = new MyFrame(); 
    } 
} 
+0

Вы хотите добавить KeyListener в каждую ячейку? –

+1

, пожалуйста, удалите этот ответ, 1) вы пробовали связанный код в комментарии от @MadProgrammer, 2) JFrame по умолчанию bever для ответа на KeyEvents из KeyListener, должен быть переадресован из AWTEventListener 3) никогда не использовать KeyListener для простых KeyEvents, простых KeysShortCuts – mKorbel

+0

Я не буду удалять этот ответ, потому что этот парень пытался мне помочь, даже если его ответ неправильный. Я просто посмотрел на ответ @ MadProgrammer. Спасибо тоже! –

Смежные вопросы