Java: изображение не будет отображаться, пока я не изменю размер окна - PullRequest
4 голосов
/ 20 июня 2011

Я программирую на Java, и я вхожу в GUI и графику.В моей программе я рисую изображение на JPanel и добавляю JPanel в главное окно.Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю программу, изображение не отображается, пока я не изменю размер окна вручную.Вот соответствующий код:

Где изображение нарисовано:

public class painting extends JPanel{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        this.setBackground(Color.WHITE);
        g.drawImage(Toolkit.getDefaultToolkit().getImage("image.png"), 0, 0, null);
    }
}

Где JPanel добавлен в JFrame (c - GridBagConstraints):

public class GUI extends JFrame{
    public GUI(){
        painting Pnt = new painting();
        c.gridx = 1;    c.gridy = 0;
        c.ipadx = 540;  c.ipady = 395;
        add(Pnt, c);        
    }
}

Где TheОкно настроено:

public class MainC{
    public static void main (String args[]){
        GUI gui = new GUI();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.pack();
        gui.setVisible(true);
        gui.setTitle("Title");
    }
}

Спасибо, Беннетт

РЕДАКТИРОВАТЬ: я заметил, что иногда он отображает изображение правильно, но потом, если я закрываю программу и пытаюсь снова, и это не работаетпока я не изменим его размер.

EDIT2: Вот файлы Класс GUI , Класс MainC

Ответы [ 4 ]

4 голосов
/ 20 июня 2011

Toolkit.getImage() работает асинхронно. Либо используйте ImageIO.read(), либо добавьте MediaTracker.

0 голосов
/ 20 июня 2011

делает

Toolkit.getDefaultToolkit().getImage("image.png")

приносит вам картину?
Я попробовал это с:

public class Gui extends JFrame{
public Gui() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLayout(new BorderLayout());
    this.setBounds(100, 100, 300, 300);
    JPanel pnl = new JPanel(){
        public void paintComponent(Graphics g){
            super.paintComponent(g);
            this.setBackground(Color.WHITE);
            try {
                g.drawImage(new Robot().createScreenCapture(new Rectangle(90, 90)), 0, 0, null);
            } catch (AWTException e) {
                e.printStackTrace();
            }
        }
    };
    getContentPane().add(pnl, BorderLayout.CENTER);
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Gui().setVisible(true);
        }
    });
}

и все работает.

0 голосов
/ 20 июня 2011

Ваша проблема должна быть где-то еще в вашем коде. Я скопировал и вставил ваши три класса в мою среду IDE. Единственное, что я изменил, было в GUI.java, я добавил setLayout(new GridBagLayout()); и GridBagConstraints c = new GridBagConstraints();, и я изменил расположение изображения на свое. Окно работает, как и ожидалось, с изображением, отображаемым сразу.

Я предполагаю, что у вас есть дополнительный код, не показанный здесь, такой как инициализация c, которую я добавил. Проверьте другой код, чтобы убедиться, что изначально вы не перерисовываете изображение. Кроме того, если вы отправите другой код, я могу помочь вам определить проблему

0 голосов
/ 20 июня 2011

В конструкторе GUI вы должны вызывать super () перед чем-либо еще.

Также переместите:

gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gui.pack();
gui.setVisible(true);
gui.setTitle("Title");

в конструкторе GUI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...