java - 图标对象对角线飞出框架
问题描述
在编写和修改此代码后,我遇到了这个问题:用鼠标单击会使对象出现一秒钟,然后从图像边界对角线飞出。
显然,函数“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) 但现在它只出现一秒钟然后消失。
解决方案
不要在 Swing 应用程序中使用 AWT 组件。Swing 组件以“J”开头(JMenuBar、JMenu、JMenuItem)。
//public void paint(Graphics g)
protected void paintComponent(Graphics g)
最初的评论是覆盖paintCompnent(...)
.
此外,绘制是一个动态过程,只要 Swing 确定需要绘制组件,就会调用绘制方法,因此您需要确保在每次绘制组件时重置状态。
因此,绘画方法不应该改变类的状态。您将 x/y 变量用于两个目的:
- 绘制图像
- 画椭圆。
因为你更新了绘画方法中的 x/y 变量,这会影响下次调用绘画方法时图像的位置。
如果要修复图像,则需要对图像的位置使用单独的变量。
您还需要在绘画方法中重置 x/y 变量以绘制椭圆,因为这些变量是本地的并且需要在每次绘画完成时重置。
推荐阅读
- python - Tensforflow Estimator 与 Keras 中的验证和测试
- javascript - 如何在 three.js 或 WebGL 中模拟“溢出:隐藏”?
- laravel - Guzzle 和码头工人
- php - 循环遍历php中的多维数组并执行mysql插入(股票数据)
- javascript - 在收到节点模块文件夹后安装 npm 包
- django - 如何使用 Django 的 HTML 表单来编辑用户配置文件的一部分。
- java - 为什么标准的 Java 迭代器没有 peek()?
- javascript - 如何将新创建的 PDF 发送到浏览器?
- asp.net - 无法将最简单的 ASP.NET Core Web 应用程序部署到 Azure VM
- npm - 任何与 Node JS 中的 Zurb Foundation 相关的内容都会引发相同的错误