Java не срабатывает repaint()

282
21 августа 2017, 07:52

Добрый день. Есть изображение, и методы paintComponent(Graphics g) и repaint(). Так вот: изображение рисуется только при если вручную менять размер окна мышкой, а я хочу что бы сразу. По идее для этого нужно поместить repaint() в конструктор, но это не работает( Структура проги: основной класс MainWindow extends JFrame, из него создается класс GameField extends JPanel, и в этом GameField созданы методы paintComponent(Graphics g) и repaint(). Изображение рисуется внутри метода paintComponent.

package com.company;
import javax.swing.*;
public class MainWindow extends JFrame {
    public  static  final double VERSION = 0.1;
    public MainWindow() {
        setTitle("... " + VERSION);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(1024, 768);
        setVisible(true);
        setLocation(400,100);
        add(new GameField()); // it extends JPanel
    }
    public static void main(String[] args) {
        MainWindow mainWindow = new MainWindow();
    }
}

Класс GameField:

package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GameField extends JPanel implements ActionListener {
    private final int SPEED = 5;
    private int shipX, shipY;
    private int asteroidX, asteroidY;
    private Image ship;
    private Image asteroid;
    private Image shot;
    public GameField(){
        setBackground(Color.black);
        loadImages();
        repaint();
    }
    public void loadImages(){
        ImageIcon shipIcon = new ImageIcon("ship.png");
        ship = shipIcon.getImage();
    }
    @Override  
    public void paintComponent(Graphics g) { 
        super.paintComponent(g);
        g.drawImage(ship,500, 500, this); 
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
    }
}
Answer 1

Метод setVisible(true) у JFrame нужно вызывать в самую последнюю очередь. В вашем же случае вы сначала заставляете фрейм отрендерится, а уже потом наполняете его содержимым, должно быть наоборот.

public MainWindow() {
    setTitle("... " + VERSION);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(1024, 768);
    setLocation(400,100);
    add(new GameField());
    setVisible(true);
}
READ ALSO
Java - упражнение с массивом

Java - упражнение с массивом

Взял тут в руки книжку (Кен Арнольд, Джеймс Гослинг - Язык программирования JAVA), и застрял в самом начале

224
Слетела кодировка в Sublime Text и на сайте

Слетела кодировка в Sublime Text и на сайте

Слетела кодировка ,стоит utf-8,а щас просто вопросикиОткрыл файл ,чтобы просто картинки в HTML поменять и слетела кодировка,я сохранил и она на сайте...

308
Не загружаются все данные при переходе с одной сцены в другую

Не загружаются все данные при переходе с одной сцены в другую

Есть 2 сцены, первая меню а вторая сама игра, есть масcив которому даю значения через едитор, если запускаю сразу сцену игры то всё нормально...

387
Вывести очень много строк через GridView ASP

Вывести очень много строк через GridView ASP

Есть простое ASP приложение на котором нужно вывести очень большую таблицуНа форме расположен грид вью:

277