Как динамически изменить JLabel - PullRequest
6 голосов
/ 14 декабря 2011

У меня есть одна JLabel и одна кнопка, JLabel отображает количество нажатий кнопки, однако я не могу понять, как обновить 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();
   }
}

Ответы [ 4 ]

9 голосов
/ 14 декабря 2011

Проблема в том, что вы создаете новый, другой JLabel, который не отображается на панели.

do

public void calculate(){
   pressed++;
   this.label1.setText("You have pressed button " + pressed + "times.");
} 
2 голосов
/ 14 декабря 2011

Изменить label1 = new JLabel("You have pressed button " + pressed + "times."); на label1.setText("You have pressed button " + pressed + "times.");

2 голосов
/ 14 декабря 2011

Вы звоните calculate() только тогда, когда нажата кнопка start. Таким образом, вы можете переместить этот метод в ActionListener для кнопки. И, позвонив setText на JLabel, вам не нужно звонить repaint. Обычно вам не нужно звонить repaint в Swing. Например. замените ваш код на что-то вроде этого:

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.");
    }
});
1 голос
/ 11 января 2015
 /* 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();
...