【问题标题】:How to get BufferedImage painted onto JFrame [duplicate]如何将 BufferedImage 绘制到 JFrame [重复]
【发布时间】:2015-12-23 18:39:44
【问题描述】:

所以我正在编写代码,该代码应该采用名为 text2.png 的已保存 png 图像并将其绘制在 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,我不知道如何让它自己绘制图像。谢谢!

【问题讨论】:

  • 不要尝试在 JFrame 上绘图。创建一个作为 theJFrame 子级的 JPanel,覆盖其paintComponent() 方法并在那里进行任何绘画。并且不要在 paintComponent 方法中读取图像文件 - 您应该在构造函数中读取一次。

标签: java swing jframe png bufferedimage


【解决方案1】:

如何将 BufferedImage 绘制到 JFrame 上

无需自定义绘画。

只需使用 JLabel 来显示图像。

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

【讨论】:

    【解决方案2】:

    您的代码不应直接调用您的绘制方法。相反,您应该调用 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.
    

    【讨论】:

    • 如果您覆盖paint,您将面临绘画工件的风险。改写paintComponent
    • 第一个是 super.paintComponent。里面的代码行
    • @user1803551你确实是对的。我已经更新了代码。
    • null 应该是这个(但不知何故并不重要 - ImageObserver)
    • 另外,为了双缓冲,最好扩展JComponent 而不是Component
    猜你喜欢
    • 1970-01-01
    • 2015-03-12
    • 2012-04-03
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多