图标对象斜向超出框架

时间:2018-12-24 14:15:24

标签: java swing graphics

在编写和修改此代码后,我遇到了以下问题: 用鼠标单击使该对象出现一秒,然后沿图像边界的对角线飞出。

显然,函数“ repaint()”负责在“ paint(Graphics g)”块中的这种情况。 消除reapaint()部分会使对象出现一秒钟,然后消失。

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)   但是现在它只出现了片刻,然后消失了。

1 个答案:

答案 0 :(得分:0)

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

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

原始注释是覆盖paintCompnent(...)

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

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

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

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

如果要固定图像,则需要使用单独的变量来确定图像的位置。

您还需要在绘画方法中重置x / y变量以绘制椭圆形,因为这些变量是局部变量,每次绘制时都需要重置。