2012-10-25 42 views
2

我通过一些简单的应用工作,以熟悉Swing和遇到了问题。图像绘制作品的JFrame的,而不是JPanel的

我试图与按钮沿着包含的图像(在面板)的帧从图像放大/缩小。

我已经能够使添加图像的框架工作正常(尽管有一些框架尺寸问题,但这是另一回事),但是,当我调用相同的组件类将其添加到面板时,出现。我希望你们中的一位能够帮助解释这种情况。

CODE:

图像帧 - 正在按所示

class ImageFrame extends JFrame{ 

public ImageFrame(){ 
    setTitle("Java Image Machine"); 

    init(); 
    pack(); 
} 

public final void init(){ 
    //ZoomPanel zoomPanel = new ZoomPanel(); 
    //ImagePanel imagePanel = new ImagePanel(); 
    ImageComponent component = new ImageComponent(); 

    //this.add(zoomPanel, BorderLayout.CENTER); 
    this.add(component); 
    //this.add(imagePanel, BorderLayout.SOUTH); 
} 
} 

但是,使用ImagePanel或直接ImageComponent呼叫同时添加ZoomPanel,不会:

class ImagePanel extends JPanel{  
public ImagePanel(){ 
    //setBorder(BorderFactory.createLineBorder(Color.black)); 
    ImageComponent component = new ImageComponent(); 
    add(component); 
} 
} 

组件类:

class ImageComponent extends JComponent{ 
public ImageComponent(){ 

    try{ 
     image = ImageIO.read(new File("test1.bmp")); 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 

    System.out.println("W: " + image.getWidth(this) + " H: " + image.getHeight(this)); 
} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    if (image == null) 
     return; 

    width = image.getWidth(this); 
    height = image.getHeight(this); 

    //System.out.println("Image should be painted"); 
    g.drawImage(image, 0, 0, null); 
} 

private Image image; 
public int width; 
public int height; 

}

回答

4

它工作正常,我(我只是测试了ImageComponent类):

enter image description here

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Image; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 

public class Test { 

    /** 
    * Default constructor Test.class 
    */ 
    public Test() { 
     initComponents(); 
    } 

    public static void main(String[] args) { 

     /** 
     * Create GUI and components on Event-Dispatch-Thread 
     */ 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Test test = new Test(); 
      } 
     }); 
    } 

    /** 
    * Initialize GUI and components (including ActionListeners etc) 
    */ 
    private void initComponents() { 
     JFrame jFrame = new JFrame(); 
     jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //add ImageComponent to JFrame instance 
     jFrame.add(new ImageComponent()); 

     //pack frame (size JFrame to match preferred sizes of added components and set visible 
     jFrame.pack(); 
     jFrame.setVisible(true); 
    } 
} 

class ImageComponent extends JComponent { 

    private Image image; 
    public int width; 
    public int height; 

    public ImageComponent() { 
     try { 
      image = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png"))); 
      //image = ImageIO.read(new URL("http://harmful.cat-v.org/software/_java/java-evil-edition.png"));//uses images scale 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     //so we can set the JPanel preferred size to the image width and height 
     ImageIcon ii = new ImageIcon(image); 
     width = ii.getIconWidth(); 
     height = ii.getIconHeight(); 
    } 

    //so our panel is the same size as image 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(width, height); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 

     if (image == null) { 
      return; 
     } 

     width = image.getWidth(this); 
     height = image.getHeight(this); 

     g.drawImage(image, 0, 0, null); 
    } 
} 
//class used for scaling images 
class ImageUtils { 

    static Image scaleImage(int width, int height, BufferedImage filename) { 
     BufferedImage bi; 
     try { 
      bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
      Graphics2D g2d = (Graphics2D) bi.createGraphics(); 
      g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY)); 
      g2d.drawImage(filename, 0, 0, width, height, null); 
     } catch (Exception e) { 
      return null; 
     } 
     return bi; 
    } 
} 

问题可能是路径到您的文件,或一个事实,即JPanel宽度和高度也不会因此我们覆盖getPrefferedSize(...)JPanel并根据Image返回正确大小

+2

路径处于工作状态,但我觉得你的getPreferredSize倍率为我错过了什么。我无法获得框架来拾取尺寸。谢谢! – DivinusVox

+0

+1高兴地工作 –

1

您是否尝试过在添加适当的组件后添加repaint()调用?

class ImagePanel extends JPanel{  
    public ImagePanel(){ 
     //setBorder(BorderFactory.createLineBorder(Color.black)); 
     ImageComponent component = new ImageComponent(); 
     add(component); 
     repaint(); 
    } 
} 

还仔细检查要添加的ImagePanel(包含ImageComponent)到IMAGEFRAME,并调用.setVisible(真)。

+0

我实际上发现在API文档中右键我发布这个之后,并尝试了它 - 它似乎没有帮助。 – DivinusVox

+0

要补充(含ImageComponent)的ImagePanel到IMAGEFRAME,并调用.setVisible(真)? –

+0

宾果游戏,这似乎使其可用,只要没有在框架另一面板。非常感谢。 :) – DivinusVox