2016-04-25 4 views
1

Простите меня, если я задаю слишком большой вопрос, я пытаюсь научиться кодировать, и я думаю, что мне не хватает большой информации о KeyListiner. Я пытаюсь сделать простую программу, которая «переворачивает кости» и отображает изображение с номерами 1-6, когда пользователи нажимают клавишу. Моя программа, похоже, не реагирует на любой пользовательский ввод.Java KeyListener не отвечает

Что я делаю неправильно?

Благодарим за любую помощь, я просто пытаюсь узнать, что любой совет ценится.

public class Dice { 

public static void main (String arg[]) { 
    new DD(); 
} 
} 

class DD extends JPanel { 
DD(){ 

    JFrame frame = new JFrame(); 
    ImageIcon icon = new ImageIcon("dice.jpg"); 
    JLabel label = new JLabel(icon); 
    frame.add(label); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    addKeyListener(new Roll()); 
    } 
} 

class Roll extends JFrame implements KeyListener { 

public void keyPressed(KeyEvent event){} 
public void keyReleased(KeyEvent event){} 
public void keyTyped(KeyEvent event){ 
    int d = event.getKeyCode(); 
    if(d == KeyEvent.VK_UP){ 
     int roll = (int) (Math.random()*6) + 1; 
     System.out.println(roll); 
    } 
} 
} 
+1

Почему 'Roll' простираться от' JFrame '? * «Я думаю, что мне не хватает большой информации о KeyListiner» *, вероятно, похоже на то, что вы должны использовать [Key Bindings] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding. html) API – MadProgrammer

ответ

1

Давайте повнимательнее посмотрим на ваш DD класса ...

class DD extends JPanel { 

    DD() { 

     JFrame frame = new JFrame(); 
     ImageIcon icon = new ImageIcon("dice.jpg"); 
     JLabel label = new JLabel(icon); 
     frame.add(label); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
     addKeyListener(new Roll()); 
    } 
} 
  • Вы создаете экземпляр JFrame, внутри конструктора JPanel, что сомнительный акт .. .
  • Вы создаете JLabel и добавьте его в JFrame
  • Вы видите JFrame
  • Вы добавить KeyListener к DDJPanel

Но постойте, DD никогда не привязаны к какой-либо видимой составляющей, как это когда-либо возможно могли быть способны принимать ключевые события ?!

KeyListener будет работать только тогда, когда компонент, на котором он зарегистрирован, является сфокусированным и имеет фокус, но если он никогда не отображается на экране, он никогда не сможет сосредоточиться!

Для начала, я бы не использовать KeyListener, он имеет фокус проблем, связанных, и вместо того, чтобы использовать Key Bindings API

Например ...

import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.KeyStroke; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Dice { 

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

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

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new DD()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    class DD extends JPanel { 

     DD() { 
      setLayout(new GridBagLayout()); 
      JLabel label = new JLabel(" - "); 
      add(label); 

      addKeyBindingFor(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "Action.roll", new DiceRollAction(label)); 
     } 

     protected void addKeyBindingFor(KeyStroke keyStroke, String name, Action action) { 
      InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW); 
      ActionMap actionMap = getActionMap(); 

      inputMap.put(keyStroke, name); 
      actionMap.put(name, action); 
     } 

     public class DiceRollAction extends AbstractAction { 

      private JLabel label; 

      public DiceRollAction(JLabel label) { 
       this.label = label; 
      } 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       int roll = (int) (Math.random() * 6) + 1; 
       label.setText(Integer.toString(roll)); 
      } 
     } 

    } 

} 
+0

Благодарим за помощь. – Chaz

+0

@ Chaz Надеюсь, что это имеет смысл – MadProgrammer