2011-04-18 8 views
0
public class my_gui extends JFrame { 
    public my_gui() { 
     setTitle("Broscute 1.0 :p"); 
     setSize(954, 320); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setResizable(false); 
     setIconImage(Toolkit.getDefaultToolkit().getImage("src/img/test.png")); 
     setVisible(true); 
     initUI(); 
    } 
    public final void initUI() { //ui here 
     setLayout(null); 
     setLocationRelativeTo(null); 
     JPanel panel = new JPanel(); 
     panel.setLayout(null); 
     panel.setBounds(0, 0, 954, 320); 
     getContentPane().add(panel); 
     JButton button = new JButton("Start!"); 
     button.setBounds(0, 0, 954, 40); 
     final ImagePanel[] label = new ImagePanel[4]; 
     int i, j; 
     for(i=40, j=0;i<=220;i+=60, j++){ 
      label[j] = new ImagePanel(0, i); 
      label[j].setBounds(0, 0, 954, 320); 
      panel.add(label[j]); 
     } 
     button.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent event) { 
       label[3].X += 100; 

      } 
     }); 
     panel.add(button); 
    } 
} 
class ImagePanel extends JComponent{ 
    public int X, Y; 
    float v = 10; 
    private BufferedImage image; 
    ImagePanel(){} 
    public ImagePanel(int x, int y) { 
     X = x; Y = y; 
     try {     
      image = ImageIO.read(new File("src/img/broasca.png")); 
     } catch (IOException ex) { 
      // handle exception... 
     } 
    } 
    @Override 
    public void paintComponent(Graphics g) { 
     super.paintChildren(g); //a friend told me I should put it here 
     g.drawImage(image, X, Y, this); // see javadoc for more info on the parameters 
     repaint(); //I think this should go here 
    } 
} 

문제가 생겼습니다.자바 코드, 빠른 검토 (스윙, 그래픽 2D)

netbeans에서 실행하면 가끔씩 이미지가 의도 한대로 그려지지만 때로는 마우스를 움직여 주 창과 "시작"버튼 만 가져옵니다.

IDE 외부에서 실행하면 이미지를 찾을 수 없습니다.

내가 뭘 잘못하고 있니? 어떤 조언을 크게 주시면 감사하겠습니다. 시간 내 주셔서 감사합니다.

+0

코드 검토에서 더 잘 질문 할 수 있습니다. http://codereview.stackexchange.com/ – DJClayworth

+0

코드 검토에 대해 잘 모릅니다. 나는 이제부터 그것을 명심 할 것이다. 고마워. – sdadffdfd

답변

2

모든 초기화가 완료 될 때까지 대화 상자를 표시하지 마십시오. 즉, setVisible을 생성자의 마지막 메소드로 이동하십시오.

더 나은 재사용을 위해 JFrame 파생 클래스 호출을 setVisible (true)로 설정하지 말고 클라이언트가 수행하도록하십시오.

문제는 일단 창을 표시하면 GUI 스레드에서 변경 한 내용을 GUI 스레드에서 수행해야합니다. 그렇지 않으면보고있는 것과 같은 가짜 문제가 발생할 수 있습니다.

+0

은 매력처럼, 많이 고마워요 – sdadffdfd

+0

일단 이미지를 .jar 파일로 빌드하면 어떻게 이미지를 얻을 수 있을지에 대한 아이디어가 있습니까? – sdadffdfd

+0

새로운 ImageIcon (my_gui.class.getResource ("/ img/test.png")); – MeBigFatGuy

1

보통 paintComponent에서 가장 먼저하는 일은 super.paintComponent()을 통해 화면 비트 맵을 지우는 것입니다. 문제가 있다고 생각합니다.

+0

super.paintChildren() 대신 super.paintComponent()를 사용해 보았을 때 같은 결과가 나오고 때로는 이미지가 그려지는 경우도 있습니다. – sdadffdfd