【问题标题】:How to Properly Use repaint(); in Java如何正确使用 repaint();在爪哇
【发布时间】:2017-02-05 20:19:34
【问题描述】:

这是我第一次使用挥杆图形,请多多包涵。我当前的目标是在我按下其中一个箭头键时改变纹理(改变我正在使用的图像的方向)。为此,我创建了一个绘制方法,并且我想在按下箭头键时使用repaint(); 调用它。我也在考虑有一个参数来绘制,以便它根据它改变它正在绘制的内容。

这是我目前拥有的代码:

 //startGame.java
//Version 1.0
//09/06/2016

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


public class Main extends JFrame
{


public static void main(String[] args)
{
    final JFrame frame = new JFrame("Display Mode");
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setUndecorated(true);


    frame.pack();
    frame.setVisible(true);

    frame.addKeyListener(new KeyInput());

}
private static class KeyInput implements KeyListener
{
    public void keyPressed(KeyEvent ke)
    {
        if(ke.getKeyCode() == KeyEvent.VK_ESCAPE)
        {
            System.exit(0);
        }
        if(ke.getKeyCode() == KeyEvent.VK_RIGHT)
        {
            //repaint();


        }
        /*if(ke.getKeyCOde() == KeyEvent.VK_LEFT)
        {



        } */
    }
    public void keyTyped(KeyEvent ke)
    {}
    public void keyReleased(KeyEvent ke)
    {}
}

@Override
public void paint(Graphics g)
{
    super.paint(g);
    ImageIcon player = new ImageIcon("RealPlayersV2.png");
    image = player.getImage();

    Graphics2D g2d = (Graphics2D) g;
    g2d.drawImage(image, 187, 245, this);


}

}

在我的私有静态类 Keylistener 等中,我想调用 repaint(); 以便调用我的绘制方法。不幸的是,repaint(); 不能从我的 keylistener 方法这样的静态方法中调用。在按键上使用repaint(); 有什么优雅的解决方案吗?谢谢!

【问题讨论】:

  • 所以?不要让你的内部 KeyInput 类静态,它不像它可以在其他上下文中重用 - 无论如何它是私有的。
  • KeyInput 必须是静态的,因为它在 main 方法中被引用,它是静态的。

标签: java swing awt paint repaint


【解决方案1】:

您的 Main 类扩展了 JFrame,因此它是一个,您应该使用它,而不是像在 main 方法中那样创建新的 JFrame
然后你应该将框架初始化移动到构造函数,这将允许你使KeyListener不是静态的。当它不是静态的时候,你可以调用repaint 方法。

public class Main extends JFrame{
    public static void main(String[] args){
        new Main();
    }
    public Main(){
        super("Display Mode");
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setUndecorated(true);
        pack();
        setVisible(true);
        addKeyListener(new KeyInput());
   }
   private class KeyInput implements KeyListener{
         [...] repaint(); [...]
   }
   @Override
   public void paint(Graphics g){...}
}

【讨论】:

  • (1-) 不要覆盖 JFrame 上的paint()。自定义绘画是通过覆盖 JPanel 上的 paintComponent() 来完成的,然后将面板添加到框架中。
猜你喜欢
  • 2021-09-29
  • 2020-08-28
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 2012-12-26
  • 2011-02-27
  • 1970-01-01
  • 2015-05-25
相关资源
最近更新 更多