2012-11-26 2 views
1

아래에는 Java 프로그램 (실행기 및 컨트롤)의 두 클래스가 포함되어 있습니다. 두 클래스 모두에서 JFrame을 만들고, 배경 이미지를 그리고, 텍스트 줄을 추가합니다. 코드를 반복해서 살펴 봤지만 어떤 이유로 배경 이미지와 텍스트 줄이 두 번째 클래스 (컨트롤)에 나타나지 않습니다. 아무도 왜 이런 일이 일어 났는지 설명해 주시겠습니까?그래픽이 JFrame에 나타나지 않는 이유는 무엇입니까?

실행기 등급 :

import hungerGames.Display; 
import hungerGames.RunGame; 
import hungerGames.input.InputHandler; 

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Point; 
import java.awt.image.BufferStrategy; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

public class Launcher extends JFrame implements Runnable { 
public static final long serialVersionUID = 1L; 

protected JPanel window = new JPanel(); 

private int width = 800; 
private int height = 450; 
boolean running = false; 
Thread thread; 

public Launcher(int id) { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    setUndecorated(true); 
    setSize(new Dimension(width, height)); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setVisible(true); 
    window.setLayout(null); 
    InputHandler input = new InputHandler(); 
    addKeyListener(input); 
    addFocusListener(input); 
    addMouseListener(input); 
    addMouseMotionListener(input); 
    startMenu(); 
} 

public void updateFrame() { 
    if (InputHandler.dragged) { 
     Point p = getLocation(); 
     if (InputHandler.MouseDX != InputHandler.MousePX || InputHandler.MouseDX != InputHandler.MousePX) { 
      setLocation(p.x + InputHandler.MouseDX - InputHandler.MousePX, p.y + InputHandler.MouseDY - InputHandler.MousePY); 
     } 
    } 
} 

public void startMenu() { 
    running = true; 
    thread = new Thread(this, "menu"); 
    thread.start(); 
} 

public void stopMenu() { 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while (running) { 
     try { 
      renderMenu(); 
     } catch (IllegalStateException e) { 
      System.out.println("Handled"); 
     } 
     updateFrame(); 
    } 
} 

private void renderMenu() throws IllegalStateException { 
    BufferStrategy bs = this.getBufferStrategy(); 
    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 
    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 800, 450); 
    try { 
     g.drawImage(ImageIO.read(Display.class.getResource("/main_menu.jpg")), 0, 0, 800, 450, null); 
     if (InputHandler.mouseX >= 50 && InputHandler.mouseX <= 100 && InputHandler.mouseY >= 290 && InputHandler.mouseY <= 325) { 
      g.drawImage(ImageIO.read(Launcher.class.getResource("/pin.png")), 10, 295, 30, 33, null); 
      if (InputHandler.MouseButton == 1) { 
       dispose(); 
       new RunGame(); 
      } 
     } 
     if (InputHandler.mouseX >= 50 && InputHandler.mouseX <= 320 && InputHandler.mouseY >= 390 && InputHandler.mouseY <= 425) { 
      g.drawImage(ImageIO.read(Launcher.class.getResource("/pin.png")), 10, 395, 30, 33, null); 
      if (InputHandler.MouseButton == 1) { 
       dispose(); 
       new Controls(); 
      } 
     } 
     if (InputHandler.mouseX >= 400 && InputHandler.mouseX <= 490 && InputHandler.mouseY >= 290 && InputHandler.mouseY <= 325) { 
      g.drawImage(ImageIO.read(Launcher.class.getResource("/pin.png")), 360, 295, 30, 33, null); 
      if (InputHandler.MouseButton == 1) { 
       dispose(); 
       new Credits(); 
      } 
     } 
     if (InputHandler.mouseX >= 400 && InputHandler.mouseX <= 440 && InputHandler.mouseY >= 390 && InputHandler.mouseY <= 425) { 
      g.drawImage(ImageIO.read(Launcher.class.getResource("/pin.png")), 360, 395, 30, 33, null); 
      if (InputHandler.MouseButton == 1) { 
       System.exit(0); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    g.setColor(Color.WHITE); 
    g.setFont(new Font("Agency FB", 0, 30)); 
    g.drawString("By Lawrence Zhao", 210, 275); 
    g.setFont(new Font("Agency FB", 0, 40)); 
    g.drawString("Play", 50, 325); 
    g.drawString("Controls and Options", 50, 425); 
    g.drawString("Credits", 400, 325); 
    g.drawString("Exit", 400, 425); 
    g.dispose(); 
    bs.show(); 
} 
} 

컨트롤 클래스 :

import hungerGames.Display; 
import hungerGames.input.InputHandler; 

import java.awt.Choice; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Rectangle; 
import java.awt.image.BufferStrategy; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 

public class Controls extends JFrame{ 
public static final long serialVersionUID = 1L; 

protected JPanel window = new JPanel(); 

private int width = 720; 
private int height = 450; 
private Rectangle rResolution; 
private Choice resolution = new Choice(); 

public Controls() { 
    try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    setUndecorated(true); 
    setSize(new Dimension(width, height)); 
    setLocationRelativeTo(null); 
    setResizable(false); 
    setVisible(true); 
    window.setLayout(null); 
    InputHandler input = new InputHandler(); 
    addKeyListener(input); 
    addFocusListener(input); 
    addMouseListener(input); 
    addMouseMotionListener(input); 

    renderControls(); 
    drawButtons(); 
    stopMenuThread(); 
} 

private void stopMenuThread() { 
    Display.getLauncherInstance().stopMenu(); 
} 

private void drawButtons() { 

    rResolution = new Rectangle(50,100, 100, 25); 
    resolution.setBounds(rResolution); 
    resolution.add("640, 400"); 
    resolution.add("800, 600"); 
    resolution.add("1024, 768"); 
    resolution.select(1); 
    add(resolution); 
} 

private void renderControls() throws IllegalStateException { 
    BufferStrategy bs = this.getBufferStrategy(); 
    if (bs == null) { 
     createBufferStrategy(3); 
     return; 
    } 
    Graphics g = bs.getDrawGraphics(); 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, 720, 450); 
    try { 
     g.drawImage(ImageIO.read(Display.class.getResource("/controls.jpg")),0, 0, 720, 450, null); 
     if (InputHandler.mouseX >= 360 && InputHandler.mouseX <= 400 && InputHandler.mouseY >=270 && InputHandler.mouseY <=305) { 
      g.drawImage(ImageIO.read(Controls.class.getResource("/pin.png")),360,270, 30, 33, null); 
      if (InputHandler.MouseButton == 1) { 
       Display.selection = resolution.getSelectedIndex(); 
       dispose(); 
       new Launcher(0); 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    g.setColor(Color.WHITE); 
    g.setFont(new Font("Agency FB", 0, 40)); 
    g.drawString("Exit", 400, 300); 
    g.dispose(); 
    bs.show(); 
} 

}

답변

3

그것은 버퍼링 전략이 일을 생각하는 방법을 이해하지 않는 것이 분명하다.

나는 단서를 찾기 위해 Double Buffering을 읽으 셨습니다.

(PS, 나는 어느 API의 측면에 많은 경험을 가지고 있지 않지만, 단순히 위의 링크 혀를 통해 읽어 작동하도록 코드를 가지고)

이 보인다

업데이트 ... 나를 위해

enter image description here

일부 메모를 잘 작동합니다.

  • 이미지를 미리로드하십시오. 그렇지 않으면 입출력이 속도가 느려지므로 시간을 두 배로 낭비하게됩니다.
  • 는 이미지가 존재하는지 확인하고 적절하게

로딩을 시작합니다.

public class BadPaint03 { 

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

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

       Controls frame = new Controls(); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class Controls extends JFrame { 

     private int width = 720; 
     private int height = 450; 
     private Rectangle rResolution; 
     protected JPanel window = new JPanel(); 
     private BufferedImage background; 

     public Controls() { 

      try { 
       background = ImageIO.read(new File("/path/to/your/image")); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      setUndecorated(true); 
      setSize(new Dimension(width, height)); 
      setLocationRelativeTo(null); 
      setResizable(false); 
      setVisible(true); 
      window.setLayout(null); 

      new Thread(new Runnable() { 
       @Override 
       public void run() { 

        while (true) { 

         renderControls(); 
         try { 
          Thread.sleep(1000/24); 
         } catch (InterruptedException ex) { 
          Logger.getLogger(BadPaint03.class.getName()).log(Level.SEVERE, null, ex); 
         } 

        } 

       } 
      }).start(); 

     } 

     private void renderControls() throws IllegalStateException { 
      BufferStrategy bs = this.getBufferStrategy(); 
      if (bs == null) { 
       createBufferStrategy(3); 
       return; 
      } 
      Graphics g = bs.getDrawGraphics(); 
      g.setColor(Color.BLACK); 
      g.fillRect(0, 0, 720, 450); 

      if (background != null) { 

       int x = (720 - background.getWidth())/2; 
       int y = (450 - background.getHeight())/2; 
       g.drawImage(background, x, y, null); 

      } 

      g.setColor(Color.WHITE); 
      g.setFont(new Font("Agency FB", 0, 40)); 
      g.drawString("Exit", 400, 300); 
      g.dispose(); 
      bs.show(); 
     } 
    } 
} 
+0

필자는 예제 2에서 수행 한 작업을 거의 수행했다고 생각합니다. 이전에 비슷한 코드가 있었지만 효과가있었습니다.하지만 여기서는 배경 이미지가 나타나지 않습니다. 몇 가지 이유. 나는 당신이 그것을보고 싶었을 경우에 대비하여 이전 코드를 추가했습니다. – user1852058

관련 문제