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

The Thread.sleep는 전체 화면을 보려고하는 것일 뿐이므로 예상대로 작동하기 때문에 페인트 방법이 충돌하는 것 같지 않음 – Debels

+0

* "페인트 방법이 예상대로 작동하기 때문에 충돌하지 않는 것 같습니다."* - 그게 문제입니다. , 그것으로 작동하지 않습니다, 자세한 내용은 내 대답을 참조하십시오;) – MadProgrammer

답변

5

첫 번째 문제는 당신 paint 방법이 될 것입니다 ...의 책임

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

paint 방법은 ... 배경을 칠하는 것입니다. 그러나 super.paint을 호출하지 않으므로 이러한 일이 발생할 수 없습니다. (super.paintComponent 전화를 잊고되지 않음)

당신은 JFrame 같은 최고 수준의 컨테이너에 최우선 paint을 피해야한다 대신 예를 들어 JPanel처럼, 사용자 정의 구성 요소를 사용하여, 그들의 paintComponent 메소드를 오버라이드 (override).

잠재적 인 문제의 또 다른 영역은 Thread.sleep입니다. 이로 인해 이벤트 발송 스레드가 중지되어 새로운 페인트 요청이 처리되지 않을 수 있습니다. 더 나은 솔루션은 예를

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); 
     } 
    } 
} 
를 들어

... 백그라운드에서 일시 정지하는 javax.swing.Timer을 사용하고 EDT의 컨텍스트 내에서의 (a ActionListener를 통해) 알림을 제공 할 수 있습니다

+0

나는 매우 혼란 스럽다. 나는 자바에서 그래픽 부분에 대해 매우 익숙하다. 화면이나 이미지를 페인트 교체없이 교체 할 수 있습니까? – Debels

+0

당신은 올바른 길을 가고 있습니다. 하지만 당신이 한 일은 페인트가 당신의 텍스트 드로잉과 함께하는 모든 작업을 대체합니다 ... – MadProgrammer

+0

배경, 전경 및 글꼴 변경을 페인트 방법으로 시도했지만 많은 차이를 보이지 않습니다 , 나는 여전히 검은 화면이 나타납니다./ – Debels

0

이것은 내가 도전을 극복하기 위해 한 일입니다. "는, super.paint (g);"

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

그 후, 내가 추가 : 내가 메인 클래스의 run 메소드에서 setBackground의, setForeground 등과의 setFont을 제거하고 화면 클래스의 setFullScreen 메소드에 추가 메인 클래스의 paint 메소드의 첫 번째 라인으로

관련 문제