【问题标题】:JPanel repaint() not workingJPanel重绘()不工作
【发布时间】:2014-04-03 17:09:06
【问题描述】:

我已经搜索了几个标题与此类似的问题(例如how to use jpanel with paint (or repaint)),但我找不到我的代码不起作用的原因。我是 JPanels 的新手,所以我对这类事情的第一次尝试是制作一个可以用箭头键移动的三角形。我把三角形画得很好,没有问题。但是,当我尝试用箭头移动三角形时,它没有移动。谁能找到为什么它不会重绘?

JPanel 代码(我也有一个单独的 JFrame 本身的类,它只制作框架并添加面板,如果你需要看到告诉我,我会编辑它):

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

public class Drawpanel extends JPanel implements KeyListener{

    int[] xcoords = {-20,0,20};//Triangle x coordinates
    int[] ycoords = {20,-20,20};//Triangle y coordinates
    int x = 100;//X coordinate for drawing the triangle
    int y = 100;//Y coordinate for drawing the triangle
    Graphics2D g2d;
    Polygon tri = new Polygon(xcoords,ycoords,xcoords.length);//triangle

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g2d = (Graphics2D)g;
        g2d.translate(x,y);//draw triangle at x and y coordinates
        g2d.setColor(new Color(234,22,72));
        g2d.fill(tri);
    }
    public void keyTyped(KeyEvent k){}
    public void keyReleased(KeyEvent k){}
    public void keyPressed(KeyEvent k)
    {
        int keycode = k.getKeyCode();
        switch(keycode)
        {
        case KeyEvent.VK_DOWN://if down arrow pressed, decrease ship y coordinate by 10
            y -= 10;
        case KeyEvent.VK_UP:
            y += 10;
        case KeyEvent.VK_LEFT:
            x -= 10;
        case KeyEvent.VK_RIGHT:
            x += 10;
        }   
        repaint();//screen doesn't repaint
    }   

}

【问题讨论】:

  • 正如@camickr 建议的那样,查看here 了解如何用键绑定替换键侦听器。

标签: java swing paintcomponent graphics2d repaint


【解决方案1】:

不要使用 KeyListener。 Swing 旨在与Key Bindings 一起使用。

可能的问题是面板没有焦点并且没有响应 KeyEvents。有关更多信息和使用键绑定的解决方案,请参阅 Motion Using the Keyboard

另一个可能的问题是您没有覆盖面板的getPreferredSize() 方法以返回适当的Dimension,因此大小为0,因此Swing 认为没有什么可绘制的。

【讨论】:

  • 感谢您的建议。我刚刚尝试了一些键绑定教程,但我对如何使用键绑定感到非常困惑。你能解释一下如何使用像 component.getInputMap.put() 这样的方法来实现我的三角形是组件的向下箭头键击吗?
  • @imulsion,我给了你一个博客链接,里面有几个不同复杂度的工作示例。
  • 博客有工作示例,但不是针对图形而不是 JComponents
  • 好吧,键绑定的基本代码没有改变。改变的是按下键时调用的代码。您可以设置一个 x/y 值,而不是设置组件的位置,这样您就可以在绘制形状之前进行平移。或者您可以查看Playing With Shapes 并使用真实组件。
  • 啊啊啊,好多了。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多