gpt4 book ai didi

Java - 单击时使用 JComponent 将新图像添加到 Jframe

转载 作者:行者123 更新时间:2023-12-02 04:10:28 24 4
gpt4 key购买 nike

我使用 netbeans 拖放设计器创建了一个 Jframe。询问后here ,在我的 Draw 的新线程上更改 recListpaint(g) 中某些项目的颜色后,我可以使颜色更改起作用类。

现在我想添加另一个 JComponent,例如 DrawCar ,它将把 car 图像添加到 Jframe 中。我想要这个新的 JComponent,因为如果背景中的方 block 改变颜色,我不想重新渲染“汽车”。

因此,我使用 paint() 方法创建了 DrawCar,如下所示:

  public void paint(Graphics g) {
//This to make the (0,0) at the bottom-left not top-left as default.
Graphics2D g2 = (Graphics2D)g;
AffineTransform at = g2.getTransform();
at.translate(0, getHeight());
at.scale(1, -1);
g2.setTransform(at);


//Below is to draw the car
try {
image = ImageIO.read(new File("car.png"));
} catch (IOException ex) {
Logger.getLogger(Car.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
g.drawImage(image, 245, 0, null);
}

如果我将这些代码放在 Draw 类的 paint() 方法中渲染汽车,它就可以工作,所以这段代码没有问题!

Container(带有GUI的类)类中,我有一个按钮处理程序。我希望当我单击该按钮时汽车出现,因此我尝试添加到事件处理程序

private void starter_btnActionPerformed(java.awt.event.ActionEvent evt) {
Thread reDraw = new Thread(new Runnable() {
@Override
public void run() {
//draw1 below is the instance of "Draw" class
//draw1.paint2(draw1.getGraphics()); //This code works with repainting the square with new color as mentioned before

DrawCar draw2 = new DrawCar();
repaint();
revalidate();
}

});
reDraw.start();

}

但它不起作用,我不知道我在这里错过了什么。也许有一些方法可以将 DrawCar 添加到当前的 JFrame 中?

感谢您的宝贵时间!

<小时/>

编辑:我只是做了一个简单的项目来表达清楚。我创建了一个名为 Test 的 JFrame,并在其中放入一个按钮,当我单击它时,该按钮将显示图片。都是自动生成的代码。

现在我创建一个新类调用 MyClass

public class MyClass extends JComponent{
private BufferedImage image;

MyClass(){
try {
image = ImageIO.read(new File("D://pic.jpg"));
} catch (IOException ex) {
Logger.getLogger(this.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
}

public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(image, 50, 50, null);
}
}

测试中,按钮的事件处理程序如下:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
MyClass mc = new MyClass();
add(mc);
repaint();
revalidate();
}

我点击了它,但没有任何反应。该图片应该在点击时显示。我该如何让它发生?谢谢

<小时/>

编辑2:

enter image description here

这是我想要实现的图像,它是底部的绿色小车,只有当我单击“开始!”时它才会出现

最佳答案

我发现您的代码存在很多常见问题,包括:

  1. 切勿重写 Paint 方法,而应重写 JPanel 或 JComponent 的 PaintComponent 方法。
  2. 几乎总是调用 super 的方法。
  3. 切勿从绘画方法中读取文件。
  4. 您的代码公然违反了 Swing 线程规则 - 大多数 Swing 调用都应该在 Swing 事件线程上进行,而不是像您所做的那样脱离它。
  5. 最好创建并发布您的 Minimal, Complete, and Verifiable examplesscce这样我们就可以运行您实际运行的代码。

对于您的具体问题,您正在创建一个 DrawCar 组件实例,但您似乎从未将其添加到 GUI 中,因此它永远不会显示,因为它永远不是顶级窗口(例如 JFrame)的一部分或 JApplet 或 JDialog。

<小时/>

回复评论:

Just though paint() and paintComponent() are the same, just one calls another...

不,他们不是。 paint(...) 方法是这两个方法中更“原始”的,因为它基于旧的 AWT 代码库。它不会自动执行双缓冲(与 PaintComponent 不同),而是负责绘制组件、组件的边框以及组件所持有的任何子组件。由于后一个原因,您希望避免覆盖它,因为如果您搞砸了它,您所面临的风险不仅仅是组件的误画。

Back to my problem, I make it like this DrawCar draw2 = new DrawCar(); add(draw2); draw2.setVisible(true); revalidate(); repaint(); I don't know if I missed the "prefix" before add, the code is auto-generated so I can't find any JFrame frame = new JFrame(); to make frame.add(draw2) like others do with their code Any chance that we will find some logical problem?

您遇到了重大的结构问题,因为您的新 DrawCar 类在主 GUI 中再次消失。

所以我猜测你的主 GUI 中已经包含了一个 DrawCar 组件,并且你的目标是让它在按下按钮时绘制一辆汽车(你永远不会说!)。如果是这样,那么为什么不让 DrawCar 持有 JPanel 并简单地将其图标设置为您的图像。我自己,我会在程序启动时读取图像,并在那时翻转它,如果这是我的目标的话。

同样,如果您仍然遇到问题,请将问题隔离到最小的可编译可运行代码,即您的 mcve让我们测试一下。

关于Java - 单击时使用 JComponent 将新图像添加到 Jframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33843685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com