2017-01-05 6 views
1

Я пытаюсь переместить точку, нажав левые клавиши. Вот моя главная:Почему точка, которую я создал, не движется?

import javax.swing.JFrame; 

public class Main { 

public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLayout(null); 
    frame.setSize(500,500); 
    Graphic graphic=new Graphic(); 
    frame.add(graphic); 

}} 

Это графический класс, где я создал точку и я реализовал KeyListener и ActionListener:

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Graphic extends JPanel implements ActionListener, KeyListener { 
private int posX = 220; 
private int posY = 300; 
private Timer timer; 
private int delay = 8; 
private int width = 500; 
private int height = 500; 

public Graphic() { 
    addKeyListener(this); 
    setFocusable(true); 
    setFocusTraversalKeysEnabled(false); 
    timer = new Timer(delay, this); 
    timer.start(); 
    this.setSize(width, height); 
} 

public void paint(Graphics g) { 
    g.setColor(Color.black); 
    g.fillRect(0, 0, width, height); 

    g.setColor(Color.GREEN); 
    g.fillOval(posX, posY, 20, 20); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    if (e.getKeyCode() == KeyEvent.VK_LEFT) { 

     if (posX <= 20) { 
      posX = 20; 
     } else { 
      moveLeft(); 

     } 
    } 
    if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
     if (posX >= 460) { 
      posX = 460; 
     } else { 
      moveRight(); 
     } 
    } 
    repaint(); 

} 

private void moveRight() { 
    posX += 20; 

} 

private void moveLeft() { 
    posX -= 20; 

} 

@Override 
public void actionPerformed(ActionEvent e) { 
    timer.start(); 
    repaint(); 

} 

@Override 
public void keyReleased(KeyEvent e) { 
} 

@Override 
public void keyTyped(KeyEvent e) { 
} 

}

На мой взгляд, это должно работать. .. но это не так. Когда я нажимаю клавиши влево-вправо, ничего не происходит, и похоже, что это не «прослушивание» моих команд. Итак, что не так с моим кодом?

+0

Для того, чтобы 'KeyListener' работать, он должен быть не только фокусируемым, но и ** есть фокус ввода. ** Обратите внимание, что в свинге, мы обычно используем сочетание клавиш, а не ключевой слушателя. Почему бы не использовать привязки клавиш здесь? –

ответ

1

KeyListener работает, если компонент, у которого есть слушатель, имеет фокус.
JFrame по умолчанию фокусируется, когда вы показываете его, но не JPanel.

В Graphic конструктор просто добавить grabFocus():

public Graphic() { 
    addKeyListener(this); 
    setFocusTraversalKeysEnabled(true); 
    setFocusable(true); 
    grabFocus();  
    timer = new Timer(delay, this); 
    timer.start(); 
    this.setSize(width, height); 
} 

EDIT

Я испытал на моей машине. Проблема в том, что он работает случайным образом, так как JFrame должен быть видимым, если мы хотим, чтобы JPanel захватил фокус. Иногда это так, иногда это не так.
SwingUtilities.invokeLater() может решить проблему.

После добавления панели к JFrame вызовите код, который захватывает фокус в методе invokeLater().

frame.add(graphic); 
    ... 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      graphic.grabFocus(); 
     } 
    }); 
+0

Все еще не работает ... :(Любые идеи? – SomeoneNew

+0

Да, я протестировал на своей машине. Я отредактировал свой ответ, чтобы объяснить. – davidxxx

0

Вы вызываете repaint метод Component класс вместо вашего метода paint.

+0

Проблема с прослушивателем не проблема рендеринга. – davidxxx

+0

Это не работает, если я называю метод рисования ... – SomeoneNew

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