Как увидеть BufferedImage в JPanel?

Я создаю 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);
    }
}

Основной класс

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, но я не знаю, как ее исправить.

хорошо, это много запутанного кода - вы используете статический и окончательный, почему ?? у вас есть контроль над этим или просто выглядит круто ??? Я бы предложил скопировать его в меню - посмотрите, сможете ли вы его отобразить.

gpasch 09.04.2019 01:55

1) Чтобы быстрее получить помощь, редактировать добавить минимальный воспроизводимый пример или Короткий, автономный, правильный пример. 2) public void update (Graphics g) { paint (g); } О чем ты там думал? Если он не сломан, не «чините» его. 3) Где пользовательская окрашенная панель возвращает разумный предпочтительный размер для использования менеджером компоновки. 4) О, NVM. Большая часть того, о чем я мог спросить, станет очевидной в MCVE/SSCCE.

Andrew Thompson 09.04.2019 04:06

Многие фрагменты этого кода не являются необходимыми для демонстрации проблемы. Выложи mcve/sscce как советовали.

c0der 09.04.2019 09:36

Только что заметил еще один момент «о чем ты там думал?». static final PongGameMain game = new PongGameMain (). Это объявлено в структуре класса .. PongGameMain. (чешет затылок) Также static final JPanel gamePanel = new JPanel (); .. не объявляйте static для компонентов графического интерфейса. Это хак для скрыть дефектный дизайн и привести к еще большему количеству проблем.Выясните, как сделать это с нестатическим компонентом, и это часто решит проблему.

Andrew Thompson 09.04.2019 10:47

Спасибо за все ответы. Прежде всего, я отредактировал код.

Caesium 09.04.2019 12:14

@gpasch Я собирался исправить их все позже.

Caesium 09.04.2019 12:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
436
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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.

Другие вопросы по теме