2015-12-23 31 views
0

因此,我正在编写代码,应该将保存的名为text2.png的png图像绘制到JFrame中。这里是我的代码:如何获取缓存图像绘制到JFrame上

public class TrainFromData extends JComponent{ 
    public void train(String fileName) throws Exception 
    { 
     try 
     { 
      File file = new File(fileName); 
      BufferedImage img = ImageIO.read(file); 
      Graphics2D g2d = img.createGraphics(); 
      g2d.drawImage(img, 50, 50, 150, 150, null); 
      paint(g2d); 
      g2d.dispose(); 
     } 

     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    public void paint(Graphics g) 
    { 
     super.paint(g); 
    } 

    public static void main(String[] args) throws Exception { 
     JFrame testFrame = new JFrame(); 
     testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     final TrainFromData comp = new TrainFromData(); 
     comp.setPreferredSize(new Dimension(320, 200)); 
     testFrame.getContentPane().add(comp, BorderLayout.CENTER); 
     testFrame.pack(); 
     testFrame.setVisible(true); 
     comp.train("text2.png"); 
    } 
} 

我的代码只是绘制一个空的JFrame,我无法弄清楚如何把它绘制图像本身。谢谢!

+2

不要尝试在JFrame上绘图。创建一个JPanel,它是JFrame的子节点,覆盖它的'paintComponent()'方法并在那里做任何绘画。并且不要读取paintComponent方法中的图像文件 - 您应该在构造函数中读取一次。 – FredK

+0

'JLabel'也许? – MadProgrammer

回答

0

你的代码不应该直接调用你的paint方法。相反,你应该调用repaint()。然后,窗口工具包将使用适当的Graphics对象调用paint方法。你应该画进那个对象。将您的BufferedImage定义为一个实例变量。你也许可以做这样的事情:

public class TrainFromData extends Component{ 
    BufferedImage img; 
    public void train(String fileName) throws Exception 
    { 
     try 
     { 
      File file = new File(fileName); 
      img = ImageIO.read(file); 
      repaint(); 
     } 
     catch(IOException ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
    @Override 
    public void paintComponent(Graphics g) //instead of paint() 
    { 
     super.paintComponent(g); 
     if (img != null) 
      g.drawImage(img, 50, 50, 150, 150, null); 
    } 
    //etc. 
+0

如果你重写'paint',你冒着绘画工件的风险。改写'paintComponent'。 – user1803551

+1

以super.paintComponent作为第一个。里面的代码行 – mKorbel

+0

@ user1803551你确实是对的。我更新了代码。 – LIProf

1

如何获得的BufferedImage涂到JFrame中

不需要做风俗画。

只需使用JLabel来显示图像。

BufferedImage img = ImageIO.read(file); 
JLabel label = new JLabel(new ImageIcon(img)); 
... 
testFrame.add(label, BorderLayout.CENTER);