2017-05-04 44 views
0

我一直在寻找一个相当长的解决方案,但是我还没有找到一个,那么为什么不自己问这个问题?这是一个更大程序的一部分,它围绕着与图像转换有关的所有事情而构建。单击监听器在BufferedImage和图标上返回错误

我先建立了它自己,所以我可以在稍后将它添加到更大的程序中。我得到的错误是当我想从显示的图像中选择一个特定的像素。由于显示在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); 
    } 

} 

回答

4

我认为错误是不言自明的,存储在ImageIconImage实例不是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(); 
+0

非常感谢你。我只是卡住了,我猜...就像作家的块.. – Fredi

+0

我实现了你所建议的改变,但我仍然有另一个错误..来自程序的颜色始终是白色(255,255,255)。你是否知道如何解决这个问题? – Fredi