2013-10-25 36 views
0

我对Java并不熟悉,对于当前的问题我有点无知。 我试图在我的主JFrame的一个单独的类中绘制图像,但它总是只画出一小片图片(可能是10x10px)。 (使用标签工作的测试)drawImage在单独的jpanel中绘制只是一块

也许我没有使用g.drawImage方法正确,或者JPanel没有足够的空间?

主窗口:

public class Deconvolutioner extends JFrame { 
Draw z; 
Picturearea picturearea; 

class Draw extends JPanel { 
    public void paint(Graphics g) { 


    } 
} 

public Deconvolutioner() { 
    setTitle("Deconvolutioner"); 
    setLocation(30,1); 
    setSize(1300,735); 
    super.setFont(new Font("Arial",Font.BOLD,11)); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    FlowLayout flow = new FlowLayout(FlowLayout.CENTER); 

    this.setLayout(flow); 

    picturearea = new Picturearea(); 

    this.add(picturearea); 

    add(z = new Draw()); 
    setVisible(true); 

} 

class Open implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     JFileChooser fileOpen = new JFileChooser(); 
     FileFilter filter = new FileNameExtensionFilter("png & jpg files", "png", 
     "jpg"); 
     fileOpen.addChoosableFileFilter(filter); 
     int returnVal = fileOpen.showDialog(null, "Open file"); 
     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      try { 
       String path = fileOpen.getSelectedFile().getPath(); 
       URL url = new File(path).toURI().toURL(); 
       BufferedImage img = ImageIO.read(url); 

       picturearea.setPicture(img); 

      } catch (IOException ex) { 
       System.err.println("Some IOException accured (set the right path?): "); 
       System.err.println(ex.getMessage()); 
      } 
     } else { 

     } 

     repaint(); 
    } 
} 

而单独的类:

public class Picturearea extends JPanel { 
    public BufferedImage image; 
    Draw z; 

    public Picturearea() { 
     add(z = new Draw()); 
     setVisible(true); 
    } 

class Draw extends JPanel { 
    @Override 
    public void paint(Graphics g) { 
     g.drawImage(image, 0, 0, this); 

    } 
} 

public void setPicture(BufferedImage picture) { 
    try {     
     image = picture; 
    } catch (Exception e) { 
     System.err.println("Some IOException accured (did you set the right path?): "); 
     System.err.println(e.getMessage()); 
    } 
    repaint(); 
} 

} 

我对每一个帮助表示感谢。
感谢您的时间。

+0

'带有标签的测试工作)' - 那你为什么试图另起炉灶?当以实际大小绘制图像时,应该只使用JLabel。当您需要自定义图像时,您应该只使用自定义绘画。保持你的代码简单。 – camickr

回答

0
  • 您正在使用FlowLayoutJFramecontentPane的布局。 FlowLayout服从组件的preferredSize。尝试设置preferredSizepictureArea,pictureArea.setPreferredSize(Dimension)或覆盖getPreferredSize(Dimension)函数PictureArea类。

  • 您使用paint(Graphics g)自定义涂装

    @Override 
    public void paint(Graphics g) { 
        g.drawImage(image, 0, 0, this); 
    
    } 
    

    不要覆盖paint()的风俗画覆盖paintComponent(Graphics g)代替。而且您可能需要缩放图像以适应JPanel的大小。如果您需要缩放图像,则可以使用g.drawImage(x, y, width, height, observer)函数。

    @Override 
    public void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        g.drawImage(image, 0, 0, this); 
    
    } 
    
+0

非常感谢帮助:) 它的工作原理 – Kyrill