2014-10-01 2 views
0

4 개의 임의의 카드를 선택하고 4 개의 버튼으로 표시하는 간단한 앱을 시도하고 있습니다. 이제는 무작위 섹션을 새로 고치는 새로 고침 버튼을 추가하고 싶습니다. 호출 할 때마다 그 일을 끝낼 수 없지만 revalidate();repaint();을 성공하지 못했습니다.
누군가가이 문제에 도움이되기를 바랍니다. 미리 감사드립니다.JButton ActionListener로 jFrame을 새로 고침

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 


public class rest extends JFrame{ 
    public rest(){ 
     int x=(int)(Math.random()*55); 
     int y=(int)(Math.random()*55); 
     int z=(int)(Math.random()*55); 
     int b=(int)(Math.random()*55); 
     ImageIcon i1= new ImageIcon("image/card/"+x+".png"); 
     ImageIcon i2= new ImageIcon("image/card/"+y+".png"); 
     ImageIcon i3= new ImageIcon("image/card/"+z+".png"); 
     ImageIcon i4= new ImageIcon("image/card/"+b+".png"); 
     JButton b1 = new JButton(); 
     b1.setIcon(i1);  
     JButton b2 = new JButton(); 
     b2.setIcon(i2); 
     JButton b3 = new JButton(); 
     b3.setIcon(i3); 
     JButton b4 = new JButton(); 
     b4.setIcon(i4); 
     JPanel p = new JPanel(); 
     p.setLayout(new GridLayout(1,4,5,5)); 
     p.add(b1);  
     p.add(b2); 
     p.add(b3); 
     p.add(b4); 
     JPanel p1= new JPanel(); 
     JButton b5 = new JButton("refresh"); 
     p1.setLayout(new BorderLayout()); 
     p1.add(b5,BorderLayout.EAST); 
     setLayout(new BorderLayout()); 
     add(p,BorderLayout.CENTER); 
     add(p1,BorderLayout.SOUTH); 
     b5.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       //revalidate(); 
       //repaint(); 
      } 
     }); 
    } 

    public static void main(String[] args) { 
     rest f= new rest(); 
     f.setTitle("poker"); 
     f.setSize(300,300); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 

    } 

} 

답변

1

revalidate/repaint 아무 작업도 수행하지 않습니다. 당신은 실제로 새로운 임의의 아이콘을 만들고 다시 예를 들어, 당신은 또한 당신이 익명 클래스 예에서 로컬로 액세스하기 때문에, final로 버튼을 선언해야합니다

@Override 
public void actionPerformed(ActionEvent e) { 
    int random = (int)(Math.random()*55); 
    b1.setIcon(new ImageIcon("image/card/"+random+".png")); 
    random = (int)(Math.random()*55); 
    b2.setIcon(new ImageIcon("image/card/"+random+".png")); 
    random = (int)(Math.random()*55); 
    b3.setIcon(new ImageIcon("image/card/"+random+".png")); 
    random = (int)(Math.random()*55); 
    b4.setIcon(new ImageIcon("image/card/"+random+".png")); 
} 

버튼의 아이콘을 설정해야 final JButton b1 = new JButton();


계속해서 모든 개체를 로컬로 만들면 응용 프로그램이 커질수록 생성자가 상당히 커집니다. 일부 반원을 사용하는 것도 좋습니다. 버튼을 클래스 멤버로 만들 수 있습니다. 그런 다음 새로운 무작위 아이콘으로 버튼을 초기화하는 방법 reset()을 사용하십시오. 하나의 경우이 코드는 똑같은 작업을 수행하기 위해 두 세트의 코드를 사용하는 중복 코드를 제거합니다. 대신 메서드를 호출하십시오. 일단 생성자에서 먼저 초기화 한 다음 리셋 수신기에서 다시 호출하십시오.

Java 명명 규칙을 사용하십시오. 클래스 이름은 대문자로 시작합니다. rest ->Rest

+0

감사합니다. – thrax

관련 문제