2011-12-13 9 views
6

Ho uno JLabel e un pulsante, lo JLabel visualizza il numero di volte che il pulsante è stato premuto, tuttavia, non riesco a capire come aggiornare lo JLabel visualizzando il numero di pressioni dei pulsanti.Come modificare dinamicamente una JLabel

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

public class SimpleGui { 
    private JFrame f = new JFrame("Basic GUI"); // create Frame 
    int pressed = 0; // tracks number of button presses. 
    JLabel label1 = new JLabel("You have pressed button " + pressed + "times."); 
    private JButton start = new JButton("Click To Start!"); 

    public SimpleGui() { 
     // Setup Main Frame 
     f.getContentPane().setLayout(new GridLayout(0, 1)); 
     start.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      calculate(); 
     } 
     }); 
     // Add components 
     f.add(label1); 
     f.add(start); 
     // Allows the Swing App to be closed 
     f.addWindowListener(new ListenCloseWdw()); 
    } 

    public class ListenMenuQuit implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
     System.exit(0); 
     } 
    } 

    public class ListenCloseWdw extends WindowAdapter { 
     public void windowClosing(WindowEvent e) { 
     System.exit(0); 
     } 
    } 

    public void launchFrame() { 
     // Display Frame 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); // Adjusts panel to components for display 
     f.setVisible(true); 
    } 

    public static void main(String args[]) { 
     PrimeTime gui = new PrimeTime(); 
     gui.launchFrame(); 
    } 

    public void calculate() { 
     pressed++; 
     label1 = new JLabel("You have pressed button " + pressed + "times."); 
     // update the GUI with new jLabel 
     f.repaint(); 
    } 
} 
+0

modificato per rendere il codice leggibile. –

+0

Grazie, non ho notato i membri in precedenza ... :) – DejanLekic

risposta

9

Il problema è che si sta creando un nuovo, JLabel diverso che non si mostrano nel pannello.

fare

public void calculate(){ 
    pressed++; 
    this.label1.setText("You have pressed button " + pressed + "times."); 
} 
+0

+1 Sei stato più veloce di me e ha avuto una soluzione migliore. – Jonas

+0

+1, entrambi siete stati più veloci di me! –

2

Hai solo chiamare calculate() quando il pulsante start viene cliccato. Quindi puoi spostare quel metodo in ActionListener per il pulsante. E chiamando setText su JLabel, non è necessario chiamare repaint. Normalmente non è necessario chiamare lo repaint in Swing. Per esempio. modificare il codice per qualcosa di simile a questo, invece:

final JLabel label1 = new JLabel("You have pressed button " + pressed + "times."); 
private JButton start = new JButton(new AbstractAction("Click To Start!") { 
    public void actionPerformed(ActionEvent e) { 
     pressed++; 
     label1.setText("You have pressed button " + pressed + "times."); 
    } 
}); 
+0

Sì, quello che ha detto. :) 1+ –

2

Change label1 = new JLabel("You have pressed button " + pressed + "times."); a label1.setText("You have pressed button " + pressed + "times.");

1
/* try and understand this code, here i use an icon to set the labe's image and the getIcon method of Label's to change the icon of previous label using setIcon method. */     
Icon picLabelicon new ImageIcon(img); /* setting the icon initially*/ 
        JLabel picLabel = new JLabel(); 
        picLabel.setIcon(picLabelicon); 
        /* now you have set the icon initially now lets change it dynamically*/ 

     JLabel modify = new JLabel(new ImageIcon(newimg)); /* new label you wanted to use*/ 
        picLabelicon=modify.getIcon(); 

        picLabel.setIcon(picLabelicon); 
      revalidate(); 
      repaint(); 
Problemi correlati