2014-10-01 2 views
0

Я пробовал простое приложение, которое выбрало бы 4 случайных карты и отобразило их на 4 кнопках, пока все в порядке, я хочу добавить кнопку обновления, которая обновит случайные разделы каждый раз, когда он вызывается, но я не могу этого сделать, я пробовал revalidate(); и repaint(); без успеха.
Я надеюсь, что кто-то может мне помочь, спасибо заранее.обновить jFrame с помощью JButton ActionListener

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 ничего не будет делать. Вы должны фактически создать новый случайный значок и установить иконки на кнопки снова например

@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, так как вы доступ к ним на местном уровне от анонимного класса, т.е. final JButton b1 = new JButton();


В качестве побочного примечания вы создадите объект довольно крупным, так как ваше приложение будет расти, если вы продолжите делать все свои объекты локально. Вы можете захотеть использовать некоторые члены класса. Возможно, создайте кнопки в качестве членов класса. Затем введите метод reset(), который будет инициализировать кнопки с новыми случайными значками. Во-первых, это избавит вас от дублирования кода, как в этом случае, когда вы используете два набора кода, чтобы сделать то же самое. Вместо этого просто вызовите метод. Однажды, в конструкторе, чтобы сначала инициализировать их, затем снова вызовите его в реселлере сброса

Также используйте соглашение об именах Java. Названия классов начинаются с букв верхнего регистра. rest ->Rest

+0

Я буду помнить это, спасибо :) – thrax