2014-12-07 52 views
0

這是我的任務。重繪()方法不重繪需要的東西

我必須生成4張隨機卡片。之後,當按下刷新按鈕時,卡應該再次隨機化。我已經實現了像這樣的repaint()方法,但它不會改變卡的顯示方式。

public class FourCards extends JFrame { 

     JLabel slot1 = new JLabel(getImage()); 
     JLabel slot2 = new JLabel(getImage()); 
     JLabel slot3 = new JLabel(getImage()); 
     JLabel slot4 = new JLabel(getImage()); 

    public FourCards() { 

     JPanel CardsPanel = new JPanel(new GridLayout(1,4,5,5)); 
     add(CardsPanel); 

     CardsPanel.add(slot1); 
     CardsPanel.add(slot2); 
     CardsPanel.add(slot3); 
     CardsPanel.add(slot4); 

     JButton jbtRefresh = new JButton("Refresh"); 

     JPanel ButtonPanel = new JPanel(); 
     this.add(ButtonPanel, BorderLayout.SOUTH); 
     ButtonPanel.add(jbtRefresh); 

     jbtRefresh.addActionListener(new ButtonListener()); 

     } 

    public ImageIcon getImage() { 

     ImageIcon temp = new ImageIcon("C:/resized/" + (int)(Math.random() * 52) + ".png"); 
     return temp; 

    } 

    public void update() { 

     slot1 = new JLabel(getImage()); 
     slot2 = new JLabel(getImage()); 
     slot3 = new JLabel(getImage()); 
     slot4 = new JLabel(getImage()); 

    } 

    public static void main(String[] args) { 

     FourCards frame = new FourCards(); 
      frame.setTitle("Random 4 cards"); 
      frame.setSize(600,280); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 

    } 

    class ButtonListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 

      update(); // get new images 
      repaint(); 

     } 

    } 

} 
+0

你所做的完全等同於「把水放入4桶」,「把所有4桶水放入井中」。後來; 「添加毒藥桶」,並且當井沒有中毒時會感到驚訝。記住一個變量只是一個地方存儲的東西,沒有更多 – 2014-12-07 19:11:55

回答

1

在你update()方法是創建新的JLabel對象和這些對象不會添加到面板,使他們不會被顯示。要更改圖像,請在所有JLabel s上使用setIcon(...)方法,而不是創建新對象。

+0

我做了你的建議,它奇妙地工作。謝謝! – Dimitar 2014-12-07 21:06:56

2

當你

slot1 = new JLabel(getImage()); 
slot2 = new JLabel(getImage()); 
slot3 = new JLabel(getImage()); 
slot4 = new JLabel(getImage()); 

你不改變GUI。您正在更新slotX變量的值。您還應該替換GUI樹中的實際組件。

嘗試使CardsPanel一個成員變量,並做

CardsPanel.removeAll(); 
CardsPanel.add(new JLabel(getImage())); 
CardsPanel.add(new JLabel(getImage())); 
CardsPanel.add(new JLabel(getImage())); 
CardsPanel.add(new JLabel(getImage())); 
1

在您的update()方法中,您將創建新的JLabel s,但不會將它們添加到面板,並將面板上的舊面板保持不變。您必須更改現有的JLabel,並且不需要創建新的。像這樣:

public void update() { 
    slot1.setIcon(getImage()); 
    slot2.setIcon(getImage()); 
    slot3.setIcon(getImage()); 
    slot4.setIcon(getImage()); 
}