【问题标题】:The Code Won't Repaint Properly代码不会正确重绘
【发布时间】:2014-01-10 17:27:37
【问题描述】:

我正在尝试获取代码以移动画布上绘制的内容。但是,我不知道该怎么做。到目前为止,每当我按下应该使对象向右或向左移动的键时,绘制的对象就会消失。但是,其他不应该移动的对象会留在屏幕上。

更多信息:运行时,代码将简单地显示绘制的圆圈。然而,我认为它一直在被重新粉刷,因为这幅画一直在闪烁。当我尝试按下与键侦听器关联的按钮时,没有任何反应。

按下按钮几秒钟后,圆圈完全消失。

以下是制作不佳且杂乱无章的代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
 public class FaceFrame extends JFrame {
    private FaceCanvas face;
    public FaceFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800, 800);
        setVisible(true);
        setLayout(new BorderLayout());
        face = new FaceCanvas();
        add(face, BorderLayout.CENTER);
    }

    public static void main(String args[]) {
        JFrame faceFrame = new FaceFrame();
    }

}

class FaceCanvas extends Canvas
{   private int xpos, ypos;
    public FaceCanvas()
    {
        setBackground( Color.BLUE );
        setSize( 300, 300 );
        xpos = ypos = 50;
    }
    public void paint( Graphics g )
    { // override paint method by re-defining it
        g.setColor( Color.WHITE );
        g.drawOval( xpos, ypos, 31, 31 );
        g.drawLine( xpos + 10, ypos + 20, xpos + 20, ypos + 20 );
        repaint();
    }

    class KeyListenerTester extends JFrame implements KeyListener {

            public KeyListenerTester() {
            }

            @Override
            public void keyTyped(KeyEvent e) {

                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

                }
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {

                }

            }

            @Override
            public void keyPressed(KeyEvent e) {

                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                    addX(-10);
                }
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {
                }

            }

            @Override
            public void keyReleased(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

                }
                if (e.getKeyCode() == KeyEvent.VK_LEFT) {

                }
            }
     } 

     public void addX(int x)
     {
         xpos = xpos + 10;
         repaint();
     }
}

【问题讨论】:

    标签: java canvas graphics draw keylistener


    【解决方案1】:
    • 不要在绘制方法中添加 KeyListener
    • 不要调用 repaint 或任何可能在 paint 方法中调用 repaint 的方法。
    • 尽量避免混合使用重量较重 (Canvas) 和重量较轻 (JFrame) 的组件,它们在 z 排序和绘画方面存在问题
    • 请调用 super.paintXxx
    • 除非您有特殊原因,否则请避免使用 AWT 组件并改用 Swing 组件,您通常会得到更好的支持
    • 当改变其中一个图形对象(Face)的状态时,您应该调用 repaint 来鼓励更新 UI

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 2020-07-25
      • 2017-05-02
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多