2016-03-01 60 views
0

我想添加滚动条到java swing中的图像,也有函数从图像读取RGB。有两个问题:ScrollBar爪哇Swing图像

  1. 滚动条不起作用 - 我想把图像放到容器中......某种“常规尺寸和缩放图像”的“框架”。在缩放图片变大后 - 还有滚动条...但它不起作用。
  2. 有从鼠标位置读取RGB彩色像素的功能,但是当我添加滚动条程序时,认为图像位于(0,0)位置,并且有颜色正在读取,而不是来自实际图像。

代码: Window.class:

import java.awt.Button; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseMotionListener; 

import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JScrollPane; 


public class Window extends JFrame implements ActionListener{ 
    JButton Bzoom ; 
    ButtonGroup BGzoom, BGMzoom; 
    JRadioButton RB1,RB2,RB4,RB8,RB16; 
    JRadioButton RBM1, RBM2, RBM4, RBM8, RBM16; 
    MyImage myImage; 
    public Window() 
    { 
     super("Image_Processing"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setSize(800 , 600); 
     setLayout(new FlowLayout()); 
     setVisible(true); 
     setLocation(50,50); 
     setResizable(true); 


     // RadioButtons for X 1,2,4,8,16 
     BGzoom = new ButtonGroup(); 
     RB1 = new JRadioButton("1x",true); 
     RB2 = new JRadioButton("2X",false); 
     RB4 = new JRadioButton("4X",false); 
     RB8 = new JRadioButton("8X",false); 
     RB16 = new JRadioButton("16X",false); 


     BGzoom.add(RB1); 
     BGzoom.add(RB2); 
     BGzoom.add(RB4); 
     BGzoom.add(RB8); 
     BGzoom.add(RB16); 

     add(RB1); 
     add(RB2); 
     add(RB4); 
     add(RB8); 
     add(RB16); 

     RB1.addActionListener(this); 
     RB2.addActionListener(this); 
     RB4.addActionListener(this); 
     RB8.addActionListener(this); 
     RB16.addActionListener(this); 

     // RadioButtons for MINUS X 1,2,4,8,16 
     BGMzoom = new ButtonGroup(); 
     RBM1 = new JRadioButton("-1x",true); 
     RBM2 = new JRadioButton("-2X",false); 
     RBM4 = new JRadioButton("-4X",false); 
     RBM8 = new JRadioButton("-8X",false); 
     RBM16 = new JRadioButton("-16X",false); 

     BGzoom.add(RBM1); 
     BGzoom.add(RBM2); 
     BGzoom.add(RBM4); 
     BGzoom.add(RBM8); 
     BGzoom.add(RBM16); 

     add(RBM1); 
     add(RBM2); 
     add(RBM4); 
     add(RBM8); 
     add(RBM16); 

     RBM1.addActionListener(this); 
     RBM2.addActionListener(this); 
     RBM4.addActionListener(this); 
     RBM8.addActionListener(this); 
     RBM16.addActionListener(this); 

     Bzoom = new JButton("WYKONAJ"); 
     add(Bzoom); 
     Bzoom.addActionListener(this); 

     // RGB for mouse click 

     getContentPane().addMouseMotionListener(new MouseMotionListener() 
     { 

      public void mouseMoved(MouseEvent e) 
      { 
       int x = (int) ((getContentPane().getMousePosition().x - (myImage.getBounds().x + 1))/myImage.getZoom()); 
       int y = (int) ((getContentPane().getMousePosition().y - (myImage.getBounds().y + 1))/myImage.getZoom()); 
       int color = myImage.getColorAt(x, y); 
       Color thisColor = new Color(color); 
       System.out.println("R: " + thisColor.getRed() + " G: " + thisColor.getGreen() + " B: " + thisColor.getBlue()); 

      } 

      public void mouseDragged(MouseEvent e) { 
       // TODO Auto-generated method stub 

      } 
     }); 

    } 

    public void LoadImage(String filename) 
    { 
     myImage = new MyImage(filename); 
     JScrollPane scroll = new JScrollPane(myImage,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 
     add(scroll); 
     pack(); 
    } 
    public void actionPerformed(ActionEvent e) { 
     Object source = e.getSource(); 
     if(source == Bzoom) 
     { 
      if(RB1.isSelected()) 
      { 
       myImage.zoomIn(1); 
       repaint(); 
      } 
      else if(RB2.isSelected()) 
      { 
       myImage.zoomIn(2); 
       repaint(); 
      } 
      else if(RB4.isSelected()) 
      { 
       myImage.zoomIn(4); 
       repaint(); 
      } 
      else if(RB8.isSelected()) 
      { 
       myImage.zoomIn(8); 
       repaint(); 

      } 
      else if(RB16.isSelected()) 
      { 
       myImage.zoomIn(16); 
       repaint(); 

      } 
      else if(RBM1.isSelected()) 
      { 
       myImage.zoomOut(1); 
       repaint(); 
      } 
      else if(RBM2.isSelected()) 
      { 
       myImage.zoomOut(2); 
       repaint(); 
      } 
      else if(RBM4.isSelected()) 
      { 
       myImage.zoomOut(4); 
       repaint(); 
      } 
      else if(RBM8.isSelected()) 
      { 
       myImage.zoomOut(8); 
       repaint(); 
      } 
      else if(RBM16.isSelected()) 
      { 
       myImage.zoomOut(16); 
       repaint(); 
      } 
     } 


    } 

} 

MyImage.class:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 



public class MyImage extends JPanel{ 
    protected BufferedImage image; 
    private float zoom = (float) 1.0; 


    public MyImage() {} 
    public MyImage(String filename) 
    { 
     super(); 

     File imageFile = new File(filename); 
     try 
     { 
      image = ImageIO.read(imageFile); 

     } 
     catch (IOException e) 
     { 
      System.err.println("Blad odczytu obrazka"); 
      e.printStackTrace(); 
     } 

    Dimension dimension = new Dimension(image.getWidth(), image.getHeight()); //wymiar 
    setPreferredSize(dimension); 

    } 
    public Dimension getPreferredSize() 
    { 
     int w = (int)(zoom * (image.getWidth()+20)); 
     int h = (int)(zoom * (image.getHeight()+20)); 
     return new Dimension(w, h); 
    } 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.scale(zoom, zoom); 
     g2d.drawImage(image, 0 , 0, this); 
    } 
    public float getZoom() 
    { 
     return zoom; 
    } 
    public int getColorAt(int x, int y) 
    { 
     return image.getRGB(x, y); 
    } 
    public void zoomIn(int scale) 
    { 
     zoom = zoom*scale; 
    } 

    public void zoomOut(int scale) 
    { 
     zoom = zoom/scale; 
    } 
} 

Main.class:

import java.awt.BorderLayout; 
import java.awt.Container; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.imageio.ImageIO; 
import javax.swing.JInternalFrame; 
import javax.swing.JScrollPane; 

//import org.opencv.core.Core; 
//import org.opencv.core.CvType; 
//import org.opencv.core.Mat; 


public class Main { 


    public static void main(String[] args) throws IOException 
     { 
     Window m = new Window(); 
     m.LoadImage("file.jpg"); 


     } 
} 

感谢所有帮助和抱歉的我的英语;)

+0

请阅读[帮助]和[如何询问](http://stackoverflow.com/help/asking) –

+1

不要将“MouseListener”添加到内容窗格,将其添加到“MyImage”窗格中, 'MouseEvent'是它们生成的组件的上下文 – MadProgrammer

回答

0

滚动条不起作用 - 我想将图像放到容器中......某种具有常量大小和缩放图像的“框架”。在缩放图片变大后 - 还有滚动条...但它不起作用。

您需要通知容器已有改变组件的状态,这可能会影响它的大小...

public void zoomIn(int scale) { 
    zoom = zoom * scale; 
    revalidate(); 
    repaint(); 
} 

public void zoomOut(int scale) { 
    zoom = zoom/scale; 
    revalidate(); 
    repaint(); 
} 

revalidate调用将导致容器层次结构重新验证布局信息和更新布局

有功能从鼠标位置读取RGB彩色像素,但是当我添加滚动条程序认为图像在(0,0)位置,并且有颜色正在读取,不是来自实际图像的框架。

MouseListener添加到MyImage窗格。 MouseEvent s为背景,以它们从

生成组件

您将需要一个方式来扩展鼠标,以便您能在像素中未缩放图像坐标表示回图像的“未缩放”版本