2013-04-07 6 views
0

이미지 프레임을 jframe에로드하려고했습니다. 나는이 코드가 왜 작동하지 않는지 전혀 모른다. jpanels 및 jlabels를 사용하여 이미지를로드하는 다른 방법도 시도했지만 그 중 하나는 작동하지 않습니다. 나는 이것 때문에 내가 설정 한 JFrame과 관련이 있다고 생각한다. jpanels와 jlabels에서 멀리하고 싶습니다. 최소한 내 지식은 확장 할 수 없기 때문입니다. 누구든지 이미지 추가에 대한 해결책이 있다면 알려주십시오. 여기 코드는 다음과 같습니다 다시JFrames에 이미지를 추가 할 때의 문제

import java.awt.Canvas; 
import javax.swing.JFrame; 
import java.awt.*; 
import javax.swing.ImageIcon; 
import java.awt.event.KeyEvent; 
import java.awt.Graphics; 


public class Base extends Canvas implements Runnable { 

    private static final long serialVersionUID = 001; 
    private Image rock1; 
    private Image rock2; 
    private Image wood1; 

    private Thread thread; 
    private boolean running = (false); 
    private boolean paused = (false); 

    int x = 0; 
    int y = 0; 
    int z = 512; 


    private void start() { 
     if (running) 
      return; 
     running = true; 
     thread = new Thread(this); 
    } 

    public void run(){} 

    public Base(){} 

    public static void main(String[] Args) { 
     Base game = new Base(); 
     JFrame frame = new JFrame(); 
     frame.add(game); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setLocationRelativeTo(null); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     frame.setTitle("Game"); 

     System.out.println("Running..."); 

     game.start(); 
     game.loadPics(); 

    } 

    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_A) { 
      x = x - 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_D) { 
      x = x + 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_SPACE) { 
      y = y - 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_SHIFT) { 
      y = y + 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_W) { 
      z = z + 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_S) { 
      z = z - 5; 
     } 
     if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { 
      paused = (true); 
     } 
    } 

    public void loadPics(){ 

     rock1 = new ImageIcon("C\\...\\rock1.png").getImage(); 
     rock2 = new ImageIcon("C\\...\\rock2.png").getImage(); 
     wood1 = new ImageIcon("C\\....\\wood1.png").getImage(); 

     repaint(); 
    } 

    public void paint(Graphics g){ 
     while(paused = false){ 
     g.drawImage(rock1, x, y, z, z, this); 
     g.drawImage(rock2, x + 512, y, z, z, this); 
     g.drawImage(wood1, x, y + 512, z, z, this); 

     try{ 
      Thread.sleep(16); 
     }catch(Exception e){} 
     g.dispose(); 
     } 

    } 
} 

, 나는 문제가 내 JFrame의에게 있습니다 생각하지만 내가 가장 숙련 된 자바 프로그래머가 아닙니다 때문에 너무 확신 할 수 없다. 어쨌든, 해결책이나 변경해야할 점이 있으면 도움을주십시오.

+0

1) 'C \\ ... \\ rock1.png "'문자 그대로 코드에있는 것입니까? 'File f = new File ("C \\ ... \\ rock1.png");을 실행 해보십시오. System.out.println ("존재?"+ file.exists());'. 이러한 리소스는 일반적으로 파일이 아닌 URL로로드해야합니다. 그것은 약 12 ​​시간마다 논의됩니다. 2) 모든 Swing 구성 요소를 사용하십시오. 3)'javax.swing.Timer'를 사용하여'Thread'와'sleep (n)'보다는'repaint()'를 호출하십시오. 4) 직접 만든 것이 아니라면'Graphics' 인스턴스를 처리하지 마십시오. –

답변

5

당신이 할당 식을 사용하고 같은 drawImage에 대한 후속 호출이 발생하지 않도록

while (paused = false){ 

항상 false로 평가됩니다이 문. 서브 클래 싱 JComponent

  • 어떤paint 방법에 Thread.sleep를 호출하지 마십시오,

    while (paused == false){ 
    
    • paint를 사용하지 마십시오에서 paintComponent를 사용 : 당신은 아마 원시 boolean 값을 비교하는 == 연산자를 사용하는 의미 . 스윙 자체는 concurrency mechanisms입니다. 여기서 Thread.sleep을 호출하는 대신 Swing Timer을 사용하여 주기적으로 그래픽 업데이트를 수행 할 수 있습니다.

    AWT는 가벼운 스윙 구성 요소를 사용하여 잘 렌더링되지 않는 헤비급 구성 요소입니다. 스윙 응용 프로그램에는 Key Listeners 대신 Key Bindings을 사용하십시오.

  • 0

    나는 이와 같은 반복적 인 문제가 많았으며이를 해결할 방법을 개발했습니다. 먼저 public class Base을 이중 버퍼링해야합니다. paint(Graphics g)에서 paintComponent(Graphics g)으로 변경하십시오. 이러한 변수를 추가,

    public void paint(Graphics g) { 
        // TODO Auto-generated method stub (IGNORE!!!) 
    
        dbi = createImage (getWidth(),getHeight()); 
        dbg = dbi.getGraphics(); 
        paintComponent(dbg); 
        g.drawImage(dbi , 0 , 0 , this); 
    
    } 
    

    그리고 public class Base의 상단에 : 새로운 paint(Graphics g) 방법을 추가하고이 코드를 추가

    private Image dbi; 
    private Graphics dbg; 
    

    이 자동으로 paintComponent(Graphics g)를 호출하고 첫 번째 단계를 완료했습니다.

    다음으로, paintComponent()에서 try 문을 제거하고 run()

    @Override 
    public void run() { 
    
        try { 
    
         while (true) { 
    
          Thread.sleep(5); // we want this so the computer doesn't go too fast 
    
         } 
    
        } catch (Exception e) { // Never have an empty catch statement 
    
         System.out.println ("Error! stacktrace: "); 
         e.printStackTrace(); 
    
        } 
    
    } 
    

    이 될이있는 @Override 주석이를 쓰거나 하지 않습니다 재 페인트.

    다음 부분은 crititcal입니다 : 은 아무것도하기 전에, 아래에 paintComponent(Graphics g)repaint();의 상단에 super.paint(g);을 넣어.

    이것은 해결되었을 것입니다. 그러나 발견 된 잠재적 인 문제점이 있습니다.

    • JFrame의 초기화

      public Base(){ 
      
          add(game); 
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
          setSize(800, 600); 
          setLocationRelativeTo(null); 
          setResizable(false); 
          setVisible(true); 
          setTitle("Game"); 
      
          start(); 
          loadPics(); 
      
      } 
      
      public static void main(String[] Args) { // Makes game smoother 
      
          Base base = new Base(); 
          Thread t = new Thread (base); 
          t.start(); 
      
      } 
      
    • 게임 플레이에 영향을주지 않습니다이 같은 private void start()를 제거합니다.

    • 올바르지 않을 수 있으므로 파일 디렉토리를 확인하십시오. 힌트 : C는 절단하지 않습니다. 그것은 C : \

    희망과 그것이 밖으로 작동 행복하게 코딩!

    관련 문제