Я создаю 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, но я не знаю, как ее исправить.
1) Чтобы быстрее получить помощь, редактировать добавить минимальный воспроизводимый пример или Короткий, автономный, правильный пример. 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 ();
.. не объявляйте static
для компонентов графического интерфейса. Это хак для скрыть дефектный дизайн и привести к еще большему количеству проблем.Выясните, как сделать это с нестатическим компонентом, и это часто решит проблему.
Спасибо за все ответы. Прежде всего, я отредактировал код.
@gpasch Я собирался исправить их все позже.
Дополнительная панель объявлена в пользовательском нарисованном классе, что панель это не только не нужна, но и является источником проблем. См. дальнейшие комментарии в коде.
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
— показать его в JLabel
через ImageIcon
.
хорошо, это много запутанного кода - вы используете статический и окончательный, почему ?? у вас есть контроль над этим или просто выглядит круто ??? Я бы предложил скопировать его в меню - посмотрите, сможете ли вы его отобразить.