paint() 方法不会在 JPanel 上绘制
paint() method would not draw on JPanel
我在 java 中尝试了一些绘图源代码,它们工作正常,但是当我尝试自己制作一个时,我无法使用 paint(Grahpics g)
方法!我再次查看了我拥有的代码并检查了 Oracle 页面中的一些教程,但我似乎无法知道为什么它不起作用。
有人可以检查一下并告诉我这里有什么问题吗?
主要方法:
public class 主要
{
public static void main(String[] args)
{
new board();
}
}
棋盘:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class board implements ActionListener
{
private JFrame f = new JFrame("Speedy");
private JPanel gamePanel = new JPanel();
private Image bg = new ImageIcon(this.getClass().getResource("road.png")).getImage();
private Timer t;
private car myCar = new car();
public board()
{
t = new Timer(50,this);
t.start();
gamePanel.setSize(600,400);
gamePanel.setDoubleBuffered(true);
gamePanel.setFocusable(true);
gamePanel.addKeyListener(new TAdapter());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(gamePanel,BorderLayout.CENTER);
//f.addKeyListener(new TAdapter());
f.setBounds(200,100,600,400);
f.setVisible(true);
f.revalidate();
f.repaint();
}
public void paint(Graphics g) {
gamePanel.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
System.out.println("Painted");
g.dispose();
}
public void actionPerformed(ActionEvent e)
{
gamePanel.repaint();
//System.out.println("Painting..");
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e)
{
myCar.keyPressed(e);
System.out.println("You pressed: "+e);
}
}
}
car.java:
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon
;
public class car
{
private Image image;
public int xPos,yPos;
public car()
{
image = new ImageIcon(this.getClass().getResource("car.png")).getImage();
xPos = 300;
yPos = 200;
System.out.println(image.getWidth(null));
}
public Image getImg() {return image;}
public void move() {}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) xPos -= 1;
if (key == KeyEvent.VK_RIGHT)xPos += 1;
if (key == KeyEvent.VK_UP) yPos -= 1;
if (key == KeyEvent.VK_DOWN) yPos += 1;
}
}
没有错误,它告诉我图像的宽度是正确的,计时器也触发了 ActionListener
,KeyListener
也在工作,但图像无法绘制! paint(Graphics g)
方法只是不想被触发!
谷歌搜索没有帮助。我认为这将是一个常见问题,但没有人遇到我遇到的问题,所有解决方案都让我失望。
请帮助?
如果有人能解释一下,将不胜感激!
您的 class Board
没有扩展 JPanel
class。所以 paint()
方法永远不会被 Swing 调用。
另外,语句gamePanel.repaint()
只会执行gamePanel
默认的JPanel
paint()
方法。相反,您希望执行覆盖的 paint
方法,因此可能需要这样做:
public class Board extends JPanel implements ActionListener {
....
public void paint(Graphics g) {
this.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
System.out.println("Painted");
g2d.dispose();
}
....
}
将您的操作功能替换为:
public void actionPerformed(ActionEvent e) {
this.repaint();
}
备选方案:
如果您不希望 Board
class 扩展 JPanel
,您还可以在初始化时覆盖 gamePanel
的 paint()
方法。
gamePanel = new JPanel() {
@Override
public void paint(Graphics g) {
this.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
g2d.dispose();
}
};
但是,我会推荐第一个解决方案,而不是这个 anonymous classes。
当您在某个容器上调用 repaint
时,Swing 会查看该容器中的所有组件并调用它们的 paint
方法。
但是,您的 board
class(顺便说一下,您应该称它为 Board
。Class 名称应始终以大写字母开头)不是JFrame 的组件。当您调用 repaint
时,Swing 将尝试调用作为 JFrame
组件的 JPanel
的绘制方法。但是您没有覆盖该方法。您刚刚向 board
添加了一个 paint
方法,而 board
不是 JFrame
.
的组件
出于这个原因,通常您应该创建一个扩展 JPanel
或其他组件的 class,然后将那个 class 的当前对象作为一个组件添加到JFrame。这样,您的 paint
方法将在重绘 JFrame
时被调用。
您的 "main" class (board
) 应该扩展 JPanel 以按预期工作。
按照你的方式, paint
永远不会被调用。它就像任何普通的自写函数一样。
如果你想保持原样,你可以这样做:
gamePanel = new JPanel()
{
@Override
public void paint(Graphics g)
{
//your code here
}
};
请记住,Class
名称应以大写字母开头。它不会出错,但它是一种命名约定,您可以在此处看到:
http://www.oracle.com/technetwork/java/codeconventions-135099.html
我在 java 中尝试了一些绘图源代码,它们工作正常,但是当我尝试自己制作一个时,我无法使用 paint(Grahpics g)
方法!我再次查看了我拥有的代码并检查了 Oracle 页面中的一些教程,但我似乎无法知道为什么它不起作用。
有人可以检查一下并告诉我这里有什么问题吗?
主要方法: public class 主要
{
public static void main(String[] args)
{
new board();
}
}
棋盘:
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class board implements ActionListener
{
private JFrame f = new JFrame("Speedy");
private JPanel gamePanel = new JPanel();
private Image bg = new ImageIcon(this.getClass().getResource("road.png")).getImage();
private Timer t;
private car myCar = new car();
public board()
{
t = new Timer(50,this);
t.start();
gamePanel.setSize(600,400);
gamePanel.setDoubleBuffered(true);
gamePanel.setFocusable(true);
gamePanel.addKeyListener(new TAdapter());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(gamePanel,BorderLayout.CENTER);
//f.addKeyListener(new TAdapter());
f.setBounds(200,100,600,400);
f.setVisible(true);
f.revalidate();
f.repaint();
}
public void paint(Graphics g) {
gamePanel.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
System.out.println("Painted");
g.dispose();
}
public void actionPerformed(ActionEvent e)
{
gamePanel.repaint();
//System.out.println("Painting..");
}
private class TAdapter extends KeyAdapter {
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e)
{
myCar.keyPressed(e);
System.out.println("You pressed: "+e);
}
}
}
car.java:
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.ImageIcon
;
public class car
{
private Image image;
public int xPos,yPos;
public car()
{
image = new ImageIcon(this.getClass().getResource("car.png")).getImage();
xPos = 300;
yPos = 200;
System.out.println(image.getWidth(null));
}
public Image getImg() {return image;}
public void move() {}
public void keyPressed(KeyEvent e)
{
int key = e.getKeyCode();
if (key == KeyEvent.VK_LEFT) xPos -= 1;
if (key == KeyEvent.VK_RIGHT)xPos += 1;
if (key == KeyEvent.VK_UP) yPos -= 1;
if (key == KeyEvent.VK_DOWN) yPos += 1;
}
}
没有错误,它告诉我图像的宽度是正确的,计时器也触发了 ActionListener
,KeyListener
也在工作,但图像无法绘制! paint(Graphics g)
方法只是不想被触发!
谷歌搜索没有帮助。我认为这将是一个常见问题,但没有人遇到我遇到的问题,所有解决方案都让我失望。
请帮助?
如果有人能解释一下,将不胜感激!
您的 class Board
没有扩展 JPanel
class。所以 paint()
方法永远不会被 Swing 调用。
另外,语句gamePanel.repaint()
只会执行gamePanel
默认的JPanel
paint()
方法。相反,您希望执行覆盖的 paint
方法,因此可能需要这样做:
public class Board extends JPanel implements ActionListener {
....
public void paint(Graphics g) {
this.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
System.out.println("Painted");
g2d.dispose();
}
....
}
将您的操作功能替换为:
public void actionPerformed(ActionEvent e) {
this.repaint();
}
备选方案:
如果您不希望 Board
class 扩展 JPanel
,您还可以在初始化时覆盖 gamePanel
的 paint()
方法。
gamePanel = new JPanel() {
@Override
public void paint(Graphics g) {
this.paint(g);
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(bg,0,0,null);
g2d.drawImage(myCar.getImg(), myCar.xPos, myCar.yPos, null);
g2d.dispose();
}
};
但是,我会推荐第一个解决方案,而不是这个 anonymous classes。
当您在某个容器上调用 repaint
时,Swing 会查看该容器中的所有组件并调用它们的 paint
方法。
但是,您的 board
class(顺便说一下,您应该称它为 Board
。Class 名称应始终以大写字母开头)不是JFrame 的组件。当您调用 repaint
时,Swing 将尝试调用作为 JFrame
组件的 JPanel
的绘制方法。但是您没有覆盖该方法。您刚刚向 board
添加了一个 paint
方法,而 board
不是 JFrame
.
出于这个原因,通常您应该创建一个扩展 JPanel
或其他组件的 class,然后将那个 class 的当前对象作为一个组件添加到JFrame。这样,您的 paint
方法将在重绘 JFrame
时被调用。
您的 "main" class (board
) 应该扩展 JPanel 以按预期工作。
按照你的方式, paint
永远不会被调用。它就像任何普通的自写函数一样。
如果你想保持原样,你可以这样做:
gamePanel = new JPanel()
{
@Override
public void paint(Graphics g)
{
//your code here
}
};
请记住,Class
名称应以大写字母开头。它不会出错,但它是一种命名约定,您可以在此处看到:
http://www.oracle.com/technetwork/java/codeconventions-135099.html