【发布时间】:2018-12-24 14:15:24
【问题描述】:
在编写和修改这段代码后,我遇到了这个问题: 用鼠标单击会使对象出现一秒钟,然后沿对角线飞出图像边界。
显然,函数“repaint()”是造成“paint(Graphics g)”块中出现这种情况的原因。 消除 repaint() 部分使对象出现一秒钟然后消失。
public class MainWindow extends JFrame implements MouseListener
{
public BufferedImage myImage,packman_icon;
private ArrayList<Point> points;
public MainWindow()
{
initGUI();
this.addMouseListener(this);
}
private void initGUI()
{
MenuBar menuBar = new MenuBar();
Menu File = new Menu("File");
Menu Run=new Menu("Run");
Menu Insert=new Menu("Insert");
MenuItem New=new MenuItem("New");
MenuItem Open = new MenuItem("Open");
MenuItem Save=new MenuItem("Save");
MenuItem start=new MenuItem("start");
MenuItem stop=new MenuItem("stop");
MenuItem packman=new MenuItem("packman");
MenuItem fruit=new MenuItem("fruit");
menuBar.add(File);
menuBar.add(Run);
menuBar.add(Insert);
File.add(New);
File.add(Open);
File.add(Save);
Run.add(start);
Run.add(stop);
Insert.add(packman);
Insert.add(fruit);
this.setMenuBar(menuBar);
try {
myImage = ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\Matala3\\Ariel1.png"));//change according to your path
packman_icon=ImageIO.read(new File("C:\\Users\\Owner\\Desktop\\pacman_icon.gif"));
} catch (IOException e) {
e.printStackTrace();
}
}
int x = -1;
int y = -1;
public void paint(Graphics g)
{
super.paintComponents(g);
g.drawImage(myImage, 0, 0, this);
g.drawImage(packman_icon, x, y, 20, 20, this);
if(x!=-1 && y!=-1)
{
int r = 10;
x = x - (r / 2);
y = y - (r / 2);
g.fillOval(x, y, r, r);
}
}
@Override
public void mouseClicked(MouseEvent arg) {
System.out.println("mouse Clicked");
System.out.println("("+ arg.getX() + "," + arg.getY() +")");
x = arg.getX();
y = arg.getY();
repaint();
}
}
public class Main
{
public static void main(String[] args)
{
MainWindow window = new MainWindow();
window.setVisible(true);
window.setSize(window.myImage.getWidth(),window.myImage.getHeight());
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我希望图像图标留在图片中而不是消失,从而创建出现在图片上的多个对象。
**我按照说明编辑了代码:deleted reapint() 方法从油漆和使用
super.paintComponet(g) 但现在它只出现一秒钟然后消失。
【问题讨论】:
-
(a) 你不应该在
paint()中调用repaint()。 (b) 在 Swing 中,您不应该覆盖paint()而应该覆盖paintComponent()(并且记得调用super.paintComponent()。 -
首先在paint() 方法中删除repaint()。您必须知道,在您的案例中, repaint() 方法就像一个轻量级组件,因此它调用 paint() 方法,使其始终带有新的 x1 和 y1 的死循环。
-
1) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。例如。 This answer 指向嵌入在 this question 中的图像的热链接。 3) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码流更容易理解! ..
-
.. 4) 请学习常见的 Java 命名法(命名约定 - 例如
EachWordUpperCaseClass、firstWordLowerCaseMethod()、firstWordLowerCaseAttribute,除非它是UPPER_CASE_CONSTANT)并始终如一地使用它。