2013-08-30 5 views
1

Так что я пытаюсь изменить фон в полноэкранном режиме, который я делаю из учебника, я пытаюсь изменить фон на зеленый, но он остается черным, что не так с кодом ?Фон не меняет цвет

Screen.java

package debels; 

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

public class Screen { 
    private GraphicsDevice vc; 

    public Screen(){ 
     GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
     vc = env.getDefaultScreenDevice(); 
    } 

    public void setFullScreen(DisplayMode dm, JFrame window){ 
     window.setUndecorated(true); 
     window.setResizable(false); 
     vc.setFullScreenWindow(window); 

     if (dm != null && vc.isDisplayChangeSupported()){ 
      try{ 
       vc.setDisplayMode(dm); 
      }catch (Exception e){} 
     } 
    } 

    public Window getFullScreen(){ 
     return vc.getFullScreenWindow(); 
    } 

    public void restoreScreen(){ 
     Window w = vc.getFullScreenWindow(); 
     if (w != null){ 
      w.dispose(); 
     } 
     vc.setFullScreenWindow(null); 
    } 
} 

Main.java

package debels; 

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

public class Main extends JFrame{ 
    private static final long serialVersionUID = -7498470134154894036L; 

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

    public void run(DisplayMode dm){ 
     setBackground(Color.GREEN); 
     setForeground(Color.BLUE); 
     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(); 
     } 
    } 

    public void paint(Graphics g){ 
     g.drawString("Hello", 200, 200); 
    } 
} 
+0

Я бы сказал, я не думаю, что 'Thread.sleep' делает вам какие-либо одобрения и не является методом' paint'. – MadProgrammer

+0

Thread.sleep - это просто увидеть полноэкранный режим, метод рисования, похоже, не конфликтует, так как он работает так, как ожидается – Debels

+0

* «Метод рисования, похоже, не конфликтует, так как он работает так, как ожидалось» * - Это проблема , он не работает должным образом, см. мой ответ для более подробной информации;) – MadProgrammer

ответ

5

Ваша первая задача будет ваш paint метод ...

public void paint(Graphics g){ 
    g.drawString("Hello", 200, 200); 
} 

Часть ответственности из paint метод заключается в том, чтобы нарисовать ... фон. Но так как вы не звоните super.paint, этого не может быть.

Вы должны избегать первостепенную paint на контейнерах верхнего уровня, как JFrame и вместо этого использовать пользовательский компонент, как JPanel, например, и переопределить их метод paintComponent (не забывая называть super.paintComponent).

Другая область потенциальной проблемы - использование Thread.sleep, это может привести к остановке Диспетчерского потока событий, что предотвращает обработку новых запросов краски. Лучшим решением может быть использование javax.swing.Timer, который приостановит в фоновом режиме и предоставляет уведомление (через ActionListener) в пределах контекста EDT ...

Например

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.DisplayMode; 
import java.awt.EventQueue; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GraphicsDevice; 
import java.awt.GraphicsEnvironment; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestFullScreen { 

    public static void main(String[] args) { 
     new TestFullScreen(); 
    } 

    public TestFullScreen() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 

       final Screen s = new Screen(); 
       DisplayMode dm = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN); 
       s.setFullScreen(dm, frame); 

       Timer timer = new Timer(5000, new ActionListener() { 
        @Override 
        public void actionPerformed(ActionEvent e) { 
         s.restoreScreen(); 
        } 
       }); 
       timer.start(); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     public TestPane() { 
      setBackground(Color.GREEN); 
      setForeground(Color.WHITE); 
      setFont(new Font("Arial", Font.PLAIN, 24)); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      int width = getWidth(); 
      int height = getHeight(); 
      FontMetrics fm = g2d.getFontMetrics(); 
      String text = "It's not easy to be green"; 
      int x = (width - fm.stringWidth(text))/2; 
      int y = ((height - fm.getHeight())/2) + fm.getAscent(); 
      System.out.println(width + "x" + height); 
      System.out.println(x + "x" + y); 
      g2d.drawString(text, x, y); 
      g2d.dispose(); 
     } 
    } 

    public class Screen { 

     private GraphicsDevice vc; 

     public Screen() { 
      GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
      vc = env.getDefaultScreenDevice(); 
     } 

     public void setFullScreen(DisplayMode dm, JFrame window) { 
      window.setUndecorated(true); 
      window.setResizable(false); 
      vc.setFullScreenWindow(window); 

      if (dm != null && vc.isDisplayChangeSupported()) { 
       try { 
        vc.setDisplayMode(dm); 
       } catch (Exception e) { 
       } 
      } 
     } 

     public Window getFullScreen() { 
      return vc.getFullScreenWindow(); 
     } 

     public void restoreScreen() { 
      Window w = vc.getFullScreenWindow(); 
      if (w != null) { 
       w.dispose(); 
      } 
      vc.setFullScreenWindow(null); 
     } 
    } 
} 
+0

Я в настоящее время довольно смущен, я совершенно новичок в графической части Java, как бы я начал писать строку на экран или изображение без замены краски? – Debels

+0

Вы на правильном пути. Но то, что вы сделали, заменяет всю работу, которую 'paint' делает с вашим текстовым рисунком ... – MadProgrammer

+0

Я попытался изменить фон, изменение переднего плана и шрифта на метод рисования, но он, похоже, не имеет большого значения , Я все еще получаю черный экран:/ – Debels

0

Это то, что я сделал для преодоления этой проблемы. Я удалил setBackground, setForeground и SetFont от метода выполнения в главном классе и добавляют их к методу setFullScreen в классе Screen:

window.getContentPane().setBackground(Color.PINK); 
    window.setForeground(Color.BLUE); 
    window.setFont(new Font ("Arial", Font.PLAIN, 24)); 

Затем я добавил «super.paint (г);» как первая строка метода краски в классе Main