【问题标题】:Drawn object doesn't clear previous rectangle after key is pressed按下键后绘制的对象不会清除前一个矩形
【发布时间】:2014-06-22 04:57:51
【问题描述】:

我的代码不会清除前一个矩形。我认为通过使用 getRect() 然后在我的 keyPressed() 方法中使用 repaint() 可以解决问题。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.Icon;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.geom.Arc2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;

import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class Rectangle extends JFrame implements KeyListener{

private int height;
private int width;
private int x;
private int y;
private Graphics2D g2;



public Rectangle(int width, int height,int x, int y)
{
    this.height = height;
    this.width = width;
    this.x = x;
    this.y = y;

   JLabel label = new JLabel();


    setSize(1000,1000);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);


    label.addKeyListener(this);
    label.setFocusable(true);
    label.setOpaque(true);
    label.addKeyListener(this);
    this.add(label);
    setVisible(true);
    label.requestFocusInWindow();

}


public void keyPressed(KeyEvent e)
{   

    if (e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        y = y + 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_LEFT)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        x = x - 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_UP)
    {
        g2.clearRect(x, y, width, height);
        repaint();
        y = y - 5;
        repaint();
    }
    if (e.getKeyCode() == KeyEvent.VK_RIGHT)
    {
        g2.clearRect(x, y, width, height);
        x = x + 5;
        repaint();
    }
}


public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}




public void paint(Graphics g) {

    g2 = (Graphics2D) g;
    g2.drawRect(x, y, width, height);

}

}

测试方法:

public class Test {

public static void main(String[] args)
{
    Rectangle rectangle = new Rectangle(400,200,500,500);

}
}

【问题讨论】:

标签: java swing jframe paint keylistener


【解决方案1】:
  1. setVisible(true) 应该是公共 Rectangle(... 中的最后一行代码,因为您已将 JComponents 添加到已经可见的 Swing GUI 中。

  2. 默认情况下,JFrame 对于KeyEvent 是不可聚焦的。

  3. JPanel放到JFrameCENTER区域,默认:myFrame.add(myPanel)

  4. 覆盖getPreferredSizeJPanel 而不是设置JFrame 大小;大小应该通过调用myFrame.pack() 来初始化。

  5. JPanel 必须可聚焦以接收KeyEventsetFocusable(true);使用 KeyBindings 而不是在 JComponent 层次结构中寻找焦点。

  6. 覆盖paintComponentJPanel;第 1 行代码应为 super.paintComponent,否则会出现绘画伪影。

【讨论】:

    【解决方案2】:

    你能补充更多细节吗? 从我所见,您可能想要制作一个清晰的按钮和方法。

    【讨论】:

    • 问题是我不想用按钮清除矩形,而是当我按下箭头键时。如果我向上按,我希望矩形向上移动并清除前一个矩形。这有帮助吗?
    • 哦,矩形是在重复吗?
    猜你喜欢
    • 1970-01-01
    • 2015-04-28
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多