首页 > 解决方案 > 图标对象对角线飞出框架

问题描述

在编写和修改此代码后,我遇到了这个问题:用鼠标单击会使对象出现一秒钟,然后从图像边界对角线飞出。

显然,函数“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);
}
}

我希望图像图标留在图片中而不是消失,从而创建出现在图片上的多个对象。

**我根据说明编辑了代码:从油漆中删除了 reapint() 方法并使用

super.paintComponet(g) 但现在它只出现一秒钟然后消失。

标签: javaswinggraphics

解决方案


不要在 Swing 应用程序中使用 AWT 组件。Swing 组件以“J”开头(JMenuBar、JMenu、JMenuItem)。

//public void paint(Graphics g)
protected void paintComponent(Graphics g)

最初的评论是覆盖paintCompnent(...).

此外,绘制是一个动态过程,只要 Swing 确定需要绘制组件,就会调用绘制方法,因此您需要确保在每次绘制组件时重置状态。

因此,绘画方法不应该改变类的状态。您将 x/y 变量用于两个目的:

  1. 绘制图像
  2. 画椭圆。

因为你更新了绘画方法中的 x/y 变量,这会影响下次调用绘画方法时图像的位置。

如果要修复图像,则需要对图像的位置使用单独的变量。

您还需要在绘画方法中重置 x/y 变量以绘制椭圆,因为这些变量是本地的并且需要在每次绘画完成时重置。


推荐阅读