如何在 JPanel 中查看 BufferedImage?

Posted

技术标签:

【中文标题】如何在 JPanel 中查看 BufferedImage?【英文标题】:How to see BufferedImage in JPanel? 【发布时间】:2019-08-30 00:47:34 【问题描述】:

我正在构建 PongClone,但遇到了一个错误。 **我认为这个错误是由 JPanel 引起的。

我尝试了 Image 而不是 BufferedImage。 我在paintComponent 方法之外尝试了drawImage。 我创建到另一个面板,然后将该面板添加到主面板中。

菜单类

package me.pong;

import javax.swing.*;

public class TestMenu 
    JFrame frame;

    public void createFrame () 
        TestMain main = new TestMain ();
        frame = new JFrame("TEST");
        frame.setSize (800, 450);
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane ().add (main.panel);
        frame.setVisible (true);
    

主类

package me.pong;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class TestMain extends JPanel 
    JPanel panel = new JPanel ();
    BufferedImage img;
    Graphics g;

    public static void main (String[] args) 
        TestMain testMain = new TestMain ();
        TestMenu menu = new TestMenu ();
        menu.createFrame ();
        testMain.drawGraphics ();
    

    public void drawGraphics()
        panel.add (new TestMain ());
        img = new BufferedImage(800, 450, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics ();
        g.drawString ("TEST STRING 2", 250,250);
    

    @Override
    protected void paintComponent (Graphics g) 
        super.paintComponent (g);
        g.clearRect (0,0,800,450);
        g.drawImage (img, 0,0,null);
        g.setColor (Color.white);
        g.drawString ("TEST STRING", 500,250);
        g.setColor (Color.black);
        g.drawRect (150,100,10,70);
    

我希望图像填充组件,但实际输出是小盒子。 Just like that

编辑:删除代码并添加 MCVE/SSCCE 代码(我不知道)。还是一样。如果我在框架内添加图像,它可以工作,但其他方式则不行。我知道我错过了什么,但我不知道那是什么。

**是的。由 JPanel 引起的问题,但我不知道如何解决。

【问题讨论】:

好吧,这是很多令人费解的代码 - 你使用静态和最终为什么?你能控制它还是看起来很酷???我建议把它撕成菜单——看看你能不能显示出来 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible example 或Short, Self Contained, Correct Example。 2) public void update (Graphics g) paint (g); 你在想什么?如果它没有损坏,请不要“修复”它。 3) 自定义绘制面板在哪里返回合理的首选尺寸以供布局管理器使用.. 4) 哦,NVM。我能问的大部分内容都会在 MCVE / SSCCE 中变得显而易见。 这段代码的许多块对于演示问题并不是必不可少的。按照建议发布 mcve / sscce。 刚刚注意到另一个“你在想什么?”的时刻。static final PongGameMain game = new PongGameMain ()。这是在 ..PongGameMain 的类结构中声明的。(抓挠头)还有static final JPanel gamePanel = new JPanel (); ..不要为 GUI 组件声明static。这是一种掩盖错误设计的技巧,并会导致更多问题。弄清楚如何使用非静态组件来做到这一点,这样做通常会解决问题。跨度> 感谢您的所有回答。首先我编辑了代码。 【参考方案1】:

在自定义绘制类中声明的面板的额外面板不仅没有必要,而且是问题的根源。在代码中查看更多 cmets。

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class TestMain extends JPanel 

    JFrame frame;
    // Not needed or useful! 
    //JPanel panel = new JPanel(); 
    BufferedImage img;
    Graphics g;

    public static void main(String[] args) 
        TestMain testMain = new TestMain();
        testMain.createFrame();
        testMain.drawGraphics();
    

    public void createFrame() 
        TestMain main = new TestMain();
        frame = new JFrame("TEST");
        frame.setSize(400, 250);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //frame.getContentPane().add(main.panel);
        frame.getContentPane().add(main);
        frame.setVisible(true);
    

    public void drawGraphics() 
        //panel.add(new TestMain());
        add(new TestMain());
        img = new BufferedImage(800, 450, BufferedImage.TYPE_INT_RGB);
        g = img.createGraphics();
        g.drawString("TEST STRING 2", 250, 250);
    

    @Override
    protected void paintComponent(Graphics g) 
        super.paintComponent(g);
        g.clearRect(0, 0, 800, 450);
        // all JComponent instances are image observers
        //g.drawImage(img, 0, 0, null);
        g.drawImage(img, 0, 0, this);
        g.setColor(Color.WHITE);
        // NEW! Otherwise invisible
        g.setColor(Color.RED); 
        g.drawString("TEST STRING", 200, 100);
        g.setColor(Color.BLACK);
        g.drawRect(150, 100, 10, 70);
    

顺便说一句:

    该代码仍有问题,但我认为最好只解决眼前的问题。 显示BufferedImage 的最简单方法是通过ImageIconJLabel 中显示它。

【讨论】:

以上是关于如何在 JPanel 中查看 BufferedImage?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击 JButton 添加 JPanel?

JPanel 投影

如何在 JTabbedPane 中读取 jpanel 的组件并将结果添加到组件中

如何利用NetBeans Swing颜色选择器控制按钮背景

如何从 JFrame 中删除 JPanel?

如何在此示例中添加新的jpanel?