JPANEL-перекраска не работает должным образом

75
6

У меня есть JPanel, класс называется WorldPanel (смотрите ниже для кода), и я использую KeyListener() для его перемещения. Он движется, поэтому я не думаю, что это KeyListener. Проблема в том, что когда я вызываю repaint() на JPanel, он медленно останавливает repaint() части экрана. Итак (в 1 и 0, когда 0 - мое изображение, а 1 - не перекрашиваемые части), изображение выглядит так:

000000000000

repaint();

100000000000

repaint();

110000000000

и т.п.

В конце концов вся панель перестает перекрашивать.

WorldPanel.java:

    public void paintComponent(Graphics g) {
super.paintComponent(g);
//This Image is instantiated in the constructor

//worldImage = ImageIO.read(new File("H:\\Java\\Game\\src\\res\\WorldBase.png"));
g.drawImage(worldImage, x, y, 6144, 4608, null);
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}

Внедрение класса:

worldPanel.addKeyListener(new KeyListener(){
Timer timer = new Timer(10, new ActionListener(){
public void actionPerformed(ActionEvent e){
worldPanel.repaint();
timer.stop();
}
});
@Override
public void keyPressed(KeyEvent arg0) {
if(arg0.getKeyCode() == KeyEvent.VK_W && worldPanel.getY() > 0){
worldPanel.setY(worldPanel.getY() + 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_A && worldPanel.getX() > 0){
worldPanel.setX(worldPanel.getX() +1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_S && worldPanel.getY() < 4608){
worldPanel.setY(worldPanel.getY() - 1);
timer.start();
}
if(arg0.getKeyCode() == KeyEvent.VK_D && worldPanel.getX() < 6144){
worldPanel.setX(worldPanel.getX() -1);
timer.start();
}
}
@Override
public void keyReleased(KeyEvent arg0) {
}
@Override
public void keyTyped(KeyEvent arg0) {
}
});

Я огляделся, и все, что я нашел, сказало:

    Переадресация вызова на EDT (с использованием таймера) Вызовите updateUI() в методе paintComponent (по-видимому, наименее понравившееся решение некоторыми людьми) (попробовал, не работал) И, наконец, Call super.paintComponent(g). Также попробовали, посмотрите в paintComponent.

спросил(а) 2021-01-19T13:51:43+03:00 2 месяца, 3 недели назад
1
Решение
76

Проблема в том, что вы переопределяете методы JComponent getX()/setX()/getY()/setY(). Это мешает вычислению области окраски панели. Дайте этим методам другое имя, то есть: setImageX()/getImageX().

ответил(а) 2021-01-19T13:51:43+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема