gpt4 book ai didi

java - JPanel 不显示我的图形

转载 作者:行者123 更新时间:2023-11-29 07:09:41 25 4
gpt4 key购买 nike

我在 JPanel 上绘图时遇到问题。这是我目前正在做的事情。我知道图像是有效的,因为我已经将它写入此类的文件并获得了我想要绘制的确切图像,但是当我尝试将它绘制到 JPanel 时,它似乎立即被删除。我试过谷歌,但已经干涸了。有什么想法吗?

import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import utilities.Log;

public class Signature extends JFrame {

/**
*
*/
private static final long serialVersionUID = 8908413895953622794L;
private JPanel contentPane;
private JPanel panel;
private BufferedImage image;

/**
* Create the frame.
*/
private Signature() {
setResizable(false);

setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setBounds(100, 100, 631, 338);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);



JLabel lblDateSigned = new JLabel("Date Signed:");
lblDateSigned.setBounds(48, 248, 91, 14);
contentPane.add(lblDateSigned);

JLabel lblDateGoesHere = new JLabel("date goes here");
lblDateGoesHere.setBounds(48, 262, 83, 14);
contentPane.add(lblDateGoesHere);

JButton btnClose = new JButton("Close");
btnClose.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
dispose();
}
});
btnClose.setBounds(521, 258, 89, 23);
contentPane.add(btnClose);
panel = new JPanel() {
private static final long serialVersionUID = -7148070953904995529L;

@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) {
Graphics gc = this.getGraphics();
// gc.setColor(Color.WHITE);
gc.drawImage(image, 0, 0, null);

}

}

@Override
public void repaint() {
super.repaint();
if (image != null) {
Graphics gc = this.getGraphics();
// gc.setColor(Color.WHITE);
gc.drawImage(image, 0, 0, null);
// gc.dispose();
}
}

};

panel.setBounds(10, 11, 600, 200);
contentPane.add(panel);

}

public byte[] getImageByteArray() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] imageInBytes = null;
try {
ImageIO.write(image, "jpg", baos);
baos.flush();
imageInBytes = baos.toByteArray();
baos.close();
} catch (IOException e) {
Log.showMessage("Error processing signature: " + e.toString());
}
return imageInBytes;
}

public void setVisible() {
setVisible(true);
panel.repaint();
}

public Signature(BufferedImage image) {
this();
this.image = image;
}
}

最佳答案

建议:

  • 不要以这种方式在组件上调用 getGraphics(),因为获得的 Graphics 实例不会持久存在。为什么不在 paintComponent 方法中使用 JVM 提供的 Graphics 对象?
  • 不要将 MouseListeners 添加到 JButton。这就是 ActionListeners 的用途。
  • 不要使用 null 布局和 setBounds,因为这会使您的程序非常不灵活并且难以更新和升级。
  • 而是继续阅读并使用布局管理器。
  • 不要像您正在做的那样重写repaint()。偶尔覆盖它是可以的,但不要像你想做的那样做更多的绘图。
  • 一定要阅读 Swing 教程,因为所有这些以及更多内容都在其中得到了很好的解释。

关于java - JPanel 不显示我的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213262/

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