gpt4 book ai didi

java - 单击监听器在 BufferedImage 和 Icon 上返回错误

转载 作者:行者123 更新时间:2023-12-01 17:57:11 29 4
gpt4 key购买 nike

我已经为此寻找解决方案很长一段时间了,但是我还没有找到,那么为什么不自己问这个问题呢?这是一个更大的程序的一部分,该程序是围绕与图像转换有关的所有内容构建的。

我首先构建了它本身,以便稍后将其添加到更大的程序中。我收到的错误是当我想从显示的图像中选择特定像素时。由于 JPanel 上显示的 Java 图标无法应用 .getRGB 和 .setRGB 方法,因此我将图像转换为 BufferedImage。但是 BufferedImage 不能直接显示在 JPanel 上。这就是图标存在的原因。

现在唯一的问题是,每次我单击图像时,都会收到错误。

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
at ImageWindow.Window1$3.mouseClicked(Window1.java:158)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

这是我为此使用的代码:

import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;


import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.Color;

import net.miginfocom.swing.MigLayout;
import javax.swing.JScrollPane;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.JTextField;
import javax.swing.JFileChooser;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JToolBar;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.awt.Dimension;
import javax.swing.JProgressBar;
import javax.swing.SwingConstants;
import java.awt.Canvas;

public class Window1 {

File File1 = new File("");
String pathName = "";
int accepted;
int x;
int y;
int colour;
ImageIcon icon;
int red;
int green;
int blue;
int width;
int height;
BufferedImage image;
int c1num;

//BufferedImage image1 = new BufferedImage(null, null, false, null);

private JFrame frame;
private JTextField textField;
private JTextField textField_1;
private JTextField textField_2;
private JTextField textField_3;
private JTextField textField_4;
private JTextField textField_5;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Window1 window = new Window1();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the parent application.
*/
public Window1() {
initialize(); //More other windows can be added to this later
}

/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setBounds(100, 100, 450, 300);
frame.getContentPane().setLayout(new MigLayout("debug", "[grow][grow]", "[][266.00,grow]"));

JToolBar toolBar = new JToolBar();
frame.getContentPane().add(toolBar, "flowx,cell 0 0 2 1,aligny top");

JLabel lblImage = new JLabel("");
lblImage.setHorizontalAlignment(SwingConstants.CENTER);





lblImage.setVerticalAlignment(SwingConstants.TOP);

JButton btnOpenImage = new JButton("Open Image");

btnOpenImage.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ec) {
JFileChooser openimage = new JFileChooser("Open image");
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg");
openimage.setFileFilter(filter);
accepted = openimage.showOpenDialog(null);
File1 = openimage.getSelectedFile();
try {
if (accepted == JFileChooser.APPROVE_OPTION) {
pathName = openimage.getSelectedFile().getPath();
icon = new ImageIcon(pathName);

lblImage.setIcon(icon);
} else {
JOptionPane.showMessageDialog(null, "Feel Free to Look Later");
}
} catch (Exception ec1) {
// TODO Auto-generated catch block
ec1.printStackTrace();
}
}
}
);


BufferedImage buffered = null;


try {
buffered = ImageIO.read(getClass().getResourceAsStream("images/test1.jpg"));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}


Color c = new Color(buffered.getRGB(x,y));


lblImage.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {
x=e.getX();
y=e.getY();


Image image = icon.getImage();
BufferedImage buffered = (BufferedImage) image;
System.out.println(x+","+y);//these co-ords are relative to the component
colour = buffered.getRGB(x,y);

red = c.getRed();
green = c.getGreen();
blue = c.getBlue();
//Integer.toBinaryString(i)
System.out.println(red + " " + green + " " + blue);
}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub

}
});


toolBar.add(btnOpenImage);

JButton btnExit = new JButton("Exit");
btnExit.addActionListener(new ActionListener() { //here, the functionality for the "exit" button is added.
public void actionPerformed(ActionEvent ev) {
System.exit(0);
}
});

JButton btnSaveImage = new JButton("Save Image");
btnSaveImage.addActionListener(new ActionListener() { //here, the functionality for the "exit" button is added.
public void actionPerformed(ActionEvent ev) {
File output = new File("image.jpg");
try {
ImageIO.write(buffered, "jpg", output);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
toolBar.add(btnSaveImage);
toolBar.add(btnExit);

JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, "cell 0 1,grow");



scrollPane.setViewportView(lblImage);

JPanel panel_1 = new JPanel();
frame.getContentPane().add(panel_1, "cell 1 1,width max(60, 10%),grow");

Box verticalBox = Box.createVerticalBox();
panel_1.add(verticalBox);

Box horizontalBox = Box.createHorizontalBox();
verticalBox.add(horizontalBox);

Box verticalBox_2 = Box.createVerticalBox();
horizontalBox.add(verticalBox_2);

JLabel label = new JLabel("R1");
verticalBox_2.add(label);

Component verticalStrut_6 = Box.createVerticalStrut(8);
verticalBox_2.add(verticalStrut_6);

JLabel label_1 = new JLabel("R2");
verticalBox_2.add(label_1);

Component verticalStrut_7 = Box.createVerticalStrut(8);
verticalBox_2.add(verticalStrut_7);

JLabel label_2 = new JLabel("R3");
verticalBox_2.add(label_2);

Component verticalStrut_8 = Box.createVerticalStrut(20);
verticalBox_2.add(verticalStrut_8);

JLabel label_3 = new JLabel("R1.1");
verticalBox_2.add(label_3);

Component verticalStrut_9 = Box.createVerticalStrut(8);
verticalBox_2.add(verticalStrut_9);

JLabel label_4 = new JLabel("R2.1");
verticalBox_2.add(label_4);

Component verticalStrut_10 = Box.createVerticalStrut(8);
verticalBox_2.add(verticalStrut_10);

JLabel label_5 = new JLabel("R3.1");
verticalBox_2.add(label_5);

Box horizontalBox_1 = Box.createHorizontalBox();
horizontalBox.add(horizontalBox_1);

Box verticalBox_3 = Box.createVerticalBox();
horizontalBox_1.add(verticalBox_3);

String red1 = (red + "");
textField = new JTextField();
textField.setText("red");

textField.setText(red1);

textField.setColumns(10);
verticalBox_3.add(textField);


String green1 = (green + "");
textField_1 = new JTextField();
textField_1.setText("green");

textField_1.setText(green1);

textField_1.setColumns(10);
verticalBox_3.add(textField_1);


String blue1 = (blue + "");
textField_2 = new JTextField();
textField_2.setText("blue");

textField_2.setText(blue1);

textField_2.setColumns(10);
verticalBox_3.add(textField_2);


Component verticalStrut_11 = Box.createVerticalStrut(20);
verticalBox_3.add(verticalStrut_11);

textField_3 = new JTextField();
textField_3.setText("Text1.1");
textField_3.setColumns(10);
verticalBox_3.add(textField_3);

textField_4 = new JTextField();
textField_4.setText("Text2.1");
textField_4.setColumns(10);
verticalBox_3.add(textField_4);

textField_5 = new JTextField();
textField_5.setText("Text3.1");
textField_5.setColumns(10);
verticalBox_3.add(textField_5);

Component verticalStrut = Box.createVerticalStrut(20);
verticalBox.add(verticalStrut);

width = buffered.getWidth();
height = buffered.getHeight();
Color col1 = new Color(red, green, blue);
c1num = col1.getRGB();

JButton btnNewButton = new JButton("Save"); //The button on the panel to set the colourk into the image
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
buffered.setRGB(width,height, c1num);

}
});
verticalBox.add(btnNewButton);
}

}

最佳答案

我认为这个错误是不言自明的,存储在ImageIcon中的Image实例不是BufferedImage的实例,相反,你需要将图标绘制到 BufferedImage

例如:

Icon icon = ...;
BufferedImage img = new BufferedImage(icon.getIconWidth(), icon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
icon.paintIcon(null, g2d, 0, 0);
g2d.dispose();

关于java - 单击监听器在 BufferedImage 和 Icon 上返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43777585/

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