2013-08-04 2 views
3

Почему JFrame пусто после моего графикаПочему JFrame пусто после моего графика

package javaGame; 

import java.awt.Graphics; 

import javax.swing.JFrame; 


public class javaGame extends JFrame { 

    public javaGame(){ 
     setVisible(true); 
     setSize(250,250); 
     setResizable(false); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setTitle("Java Game"); 
    } 

    public void paint (Graphics g){ 
     g.drawString("Hello world!", 75, 75); 
    } 

    public static void main (String[] args){ 
     new javaGame(); 
    } 
} 
+0

Я не вижу, где вы роспись. –

+3

Вам лучше прочитать учебник о Swing. – Mordechai

+1

, пожалуйста, изучите соглашения об именах java и придерживайтесь их. – kleopatra

ответ

3

Вы привыкли апплеты, где переопределение paint будет на самом деле работает. В JFrame рекомендуемая методика немного сложнее. Добавьте этот код в конструктор:

getContentPane().add(new JPanel() { 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawString("Hello world!", 75, 75); 
    } 
}); 

Это создает анонимный подкласс JPanel который переопределяет paintComponent сделать некоторые картины, а затем добавляет JPanel к раме. Призыв к super.paintComponent важен.

Есть несколько других вещей, которые вы должны знать, отличаются от апплетов:

  • Вы должны вызвать setVisible(true) сделать кадр появится. Это необходимо для работы вашей программы.
  • Вы должны добавить setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE), если вы хотите, чтобы программа была закрыта, если окно закрыто. Настоятельно рекомендуется.
1

При открытии нового кадра, вы должны сделать его видимым после validate или pack применяется к нему, также называют setVisible(true) в конце создания кадра. Код для модификации:

public void paint (Graphics g){ 
    super.paint(g); 
    g.drawString("Hello world!", 75, 75); 
} 
+0

В то время как технически созданный, не рекомендуется переопределять 'paint', особенно контейнеры верхнего уровня. Вместо этого рекомендуется переопределять компонент paintComponent от JComponent, а не – MadProgrammer

+0

Oh, но он также работает, поскольку этот пример применим. Я не думаю, что OP пытается нарисовать компоненты. –

+0

Не имеет значения, рекомендуется выполнять все пользовательские изображения из метода классов paintComponent, начиная с 'JComponent' (например,' JPanel'). Начнем с того, что вы можете легко завинтить цепочку красок, а контейнеры верхнего уровня не буферизуются двойным образом;) – MadProgrammer

1

1) Следуйте конвенции кода Java javaGame должны быть JavaGame

2) программы Качели должны переопределить paintComponent() вместо переопределения paint().

3) Вы должны сделать обычную покраску в JComponent, например JPanel.

Измените свой код на, например, примерно так.

public class JavaGame { 

    private JFrame frame; //use composition instead of concrete inheritance 

    public JavaGame() { 
     jframe.setSize(250,250); 
     jframe.setResizable(false); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setTitle("Java Game"); 
     jframe.add(new JPanel() { 
      @Override 
      public void paintComponent (Graphics g) { 
       super.paintComponent(g); 
       g.drawString("Hello world!", 75, 75); 
      } 
     }); 
     jframe.pack(); //sizes the frame 
     jframe.setVisible(true); 
    } 

    public static void main (String[] args) { 
     SwingUTilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new javaGame(); 
      } 
     }); 
    } 
} 
+1

Простите меня за редактирование, хотя это было необходимо, я думаю, вы забыли добавить метод 'run()' для интерфейса «Runnable» :-) –

+0

Я забыл thx для редактирования :-) – nachokk

Смежные вопросы