2013-04-11 4 views
0

이 코드가 있습니다. 이 코드에서 이미지는 왼쪽에서 오른쪽으로 moveImage 메서드로 이동하고 코드에서 moveimg 메서드로 오른쪽에서 왼쪽으로 이동합니다. 지금 내가 원하는 건 버튼 이벤트를하는 것입니다. 코드에 버튼이 있습니다. 버튼을 클릭하면 작업을 수행해야합니다. 하지만 여기서는 코드가 없습니다 :이미지가 움직이는 동안 버튼 이벤트가 작동하지 않습니다.

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

class MyImage extends JFrame implements ActionListener 
{ 
    static int xPixel = 20; 
    Image myImage, offScreenImage; 
    Graphics offScreenGraphics; 
    JPanel p = new JPanel(); 
    Button btn = new Button("bun"); 
    JFrame f = new JFrame(); 

    public MyImage() 
    { 
     myImage = Toolkit.getDefaultToolkit().getImage("mywineshoplogo.jpg"); 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     add(p); 
     p.add(btn); 
     moveImage(); 
     btn.addActionListener(this); 
    } 

    public void update(Graphics g) 
    { 
     paint(g); 
    } 

    public void paint(Graphics g) 
    { 
     int width = getWidth(); 
     int height = getHeight(); 
     if (offScreenImage == null) 
     { 
     offScreenImage = createImage(width, height); 
     offScreenGraphics = offScreenImage.getGraphics(); 
     } 
// clear the off screen image 
     offScreenGraphics.clearRect(0, 0, width + 1, height + 1); 
// draw your image off screen 
     offScreenGraphics.drawImage(myImage, xPixel, 10, this); 
// draw your image off screen 
// show the off screen image 
     g.drawImage(offScreenImage, 0, 0, this); 
// show the off screen image 
    } 

    void moveImage() //left to right move 
    { 
     for (int i = 0; i < 530; i++) 
     { 

     xPixel += 1; 
     repaint(); 
     // then sleep for a bit for your animation 
     try 
     { 
      Thread.sleep(40); 
     } /* this will pause for 50 milliseconds */ 

     catch (InterruptedException e) 
     { 
      System.err.println("sleep exception"); 
     } 
     } 
    } 

/* void moveimg() // right to left move 
    { 
     for (int i = 529; i > 0; i--) 
     { 
     if (i == 1) 
     { 
      moveImage(); 
     } 
     xPixel -= 1; 
     repaint(); 
// then sleep for a bit for your animation 
     try 
     { 
      Thread.sleep(40); 
     } // this will pause for 50 milliseconds 

     catch (InterruptedException e) 
     { 
      System.err.println("sleep exception"); 
      } 
     } 
    } */  

    public void actionPerformed(ActionEvent ae) 
    { 
     try 
     { 
     if (ae.getSource() == btn) 
     { 
      p.setBackground(Color.RED); 
     } 
     } 
     catch (Exception e) 
     { 
     System.out.println("error"); 
     } 
    } 

    public static void main(String args[]) 
    { 
     MyImage me = new MyImage(); 
    } 
} 
+0

코드는 간단하게 링크되지 않은 상태에서 질문에 포함되어야합니다. 그리고 그것은 적절하게 들여 쓰기되어야합니다. 그리고 언어를 나타내는 태그를 추가해야합니다. 결정된. – Dukeling

+0

죄송합니다. 어떻게 해야할지 모르겠다. 나는 여기 새로운 ... –

+0

질문에 코드를 삽입하는 것은 간단한 복사 붙여 넣기입니다. 형식을 지정하려면 코드를 선택하고 편집 상자의 맨 위에있는 '{}'버튼을 클릭하거나 Ctrl-K를 누르거나 모든 줄에 4 개의 공백을 수동으로 추가하십시오. 들여 쓰기를하려면 외부 프로그램을 사용하거나 수동으로 수행해야합니다. [편집] 페이지에서 하단에 태그를 추가 할 수도 있습니다. – Dukeling

답변

0

애니메이션을 자체 스레드로 이식해야합니다. 이렇게하면 다른 프로세스로 인해 메인 스레드가 멈추게됩니다. 메인 스레드에서 Thread.sleep(40);을 호출하고 있습니다. 이렇게하면 유일하고 유일한 스레드의 처리량에 항상 영향을 미칩니다.

그래서, 당신은 새로운 클래스를 생성해야 해결책은, ImageMover을 말한다. 이 클래스는 생성자에서 Image 객체를 가져올 수 있으며 moveImgmoveImage (매우 혼란스러운 내용) 솔루션과는 반대로 이미지를 이동하는 방법이 moveImage입니다.

둘째, ImageMoverThread입니다. 당신이 당신의 이미지가 움직이기 시작 할 때

public void run() { 
    moveImage(); 
} 

, 당신은 ImageMover.start()를 호출해야합니다 : 이것은 다음과 같이 보일 것입니다 run 방법을 작성하도록 강요합니다. NOTrun.

이렇게하면 메서드가 다른 스레드에 배치되므로 GUI의 기능을 보장해야합니다.

+0

왼쪽에서 오른쪽으로 moveImage()를 오른쪽에서 왼쪽으로 moveImg()를 이동합니다. –

+0

적절한 명명 시스템이라고 생각하십니까? – christopher

+0

아니요. 나는 그것을 cahnge ..하지만이 작동하지 않습니다 –

관련 문제