【问题标题】:Icon Object is flying diagonally out of frame图标对象对角线飞出框架
【发布时间】: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 exampleShort, Self Contained, Correct Example。 2) 例如,获取图像的一种方法是热链接到在this Q&A 中看到的图像。例如。 This answer 指向嵌入在 this question 中的图像的热链接。 3) 使用逻辑一致的形式缩进代码行和块。缩进是为了让代码流更容易理解! ..
  • .. 4) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。

标签: java swing graphics


【解决方案1】:

不要在 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 变量来绘制椭圆,因为这些变量是本地的并且需要在每次绘制完成时重置。

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-25
    • 2015-02-04
    • 2010-09-21
    • 2014-12-09
    相关资源
    最近更新 更多