2013-10-11 2 views
-1

Я пытаюсь установить цвет фона моего экрана на зеленый.Цвет фона не задан в Java

Мой код до сих пор:

package game; 

import java.awt.*; 
import javax.swing.JFrame; 


public class Game extends JFrame { 

    public static void main(String[] args) { 
     DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); 
     Game g = new Game(); 
     g.run(dm); 

    } 

    public void run(DisplayMode dm) { 
     setBackground(Color.GREEN); 
     setForeground(Color.WHITE); 
     setFont(new Font("arial", Font.PLAIN, 24)); 
     Screen s = new Screen(); 

     try { 
      s.setFullScreen(dm, this); 
      try { 
       Thread.sleep(5000); 
      } catch (Exception E) { 
      } 
     } finally { 
      s.restoreScreen(); 
     } 
    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("Check Screen", 200, 200); 
    } 
} 

Когда я запускаю программу, я получаю это:

printScreen

экран должен быть зеленым по линии:

setBackground(Color.GREEN); 

Почему при запуске программы фон не устанавливается на зеленый?

+1

Вы пробовали 'this.getContentPane() .setBackground (Color.GREEN)'? – Laf

+0

Как вы это говорите, вам кажется, что вы хотите, чтобы SCREEN был зеленым, но вы устанавливаете JFrame на зеленый цвет в коде ....? – user2277872

+1

См [ответ на тот же вопрос уже задавали] [1] [1]: http://stackoverflow.com/questions/2742270/jframe-setbackground-not-working-why – Samhain

ответ

1

Вам необходимо добавить звонок в super.paint (g); в ваш метод paint().

@Override 
public void paint(Graphics g){ 
    super.paint (g); 
    g.drawString("Check Screen", 200, 200); 
} 

Это гарантирует, что компонент правильно рисует, включая цвет фона, а затем нарисует текст.

1

Как правило, весь подход очень плохой. Даже если он работает с getContentPane().setBackground(Color.GREEN), он, вероятно, не будет работать, потому что вы вызываете Thread.sleep(5000) по телефону EDT (или у вас будут проблемы вскоре или позже). Используйте правильный компонент для повторяющейся задачи (обновление вашего экрана): Swing Timer.

Вместо переопределения JFrame'spaint метод, гораздо лучше использовать JPanel и переопределить его метод paintComponent. Итак, что-то вроде этого:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 


public class Game extends JFrame { 

    JFrame frame = new JFrame(); 

    public Game() { 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new Panel()); 
     frame.pack(); 
     frame.setVisible(true); 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Game(); 
      } 
     }); 
    } 

    class Panel extends JPanel { 
     Timer timer; 

     Panel() { 
      setBackground(Color.BLACK); 
      setForeground(Color.WHITE); 
      refreshScreen(); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.setFont(new Font("arial", Font.PLAIN, 24)); 
      g.drawString("Check Screen", 200, 200); 
     } 

     public void refreshScreen() { 
      timer = new Timer(0, new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        repaint(); 
       } 
      }); 
      timer.setRepeats(true); 
      //Aprox. 60 FPS 
      timer.setDelay(17); 
      timer.start(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(650, 480); 
     } 
    } 

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