Как увидеть BufferedImage в JPanel? - PullRequest
1 голос
/ 08 апреля 2019

Я строю PongClone, но сталкиваюсь с ошибкой.** Я думаю, что ошибка вызвана JPanel.

Я попробовал изображение вместо BufferedImage.Я попробовал drawImage вне метода paintComponent.Я создаю другую панель и затем добавляю эту панель внутри главной панели.

Класс меню

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);
    }
}

MainClass

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);
    }
}

Я ожидаю, что изображение заполнит компонент, но фактическоевыход маленькая крошечная коробка. Точно так же

РЕДАКТИРОВАТЬ: Удалите код и добавили код MCVE / SSCCE (я этого не знал).Все тот же.Если я добавлю изображение в рамку, это будет работать, а другой - нет.Я знаю, что что-то упустил, но я не знаю, что это такое.

** Да.Проблема вызвана JPanel, но я не знаю, как ее исправить.

1 Ответ

2 голосов
/ 10 апреля 2019

Дополнительная панель, объявленная в классе с пользовательской раскраской, что является панелью , была не только ненужной, но и источником проблем.См. Дальнейшие комментарии в коде.

enter image description here

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);
    }
}

В качестве отступления:

  1. Этот код по-прежнему имеет проблемы, ноЯ подумал, что лучше придерживаться решения только непосредственной проблемы.
  2. Самый простой способ отобразить BufferedImage - это показать его в JLabel через ImageIcon.
...