【问题标题】:Displaying changing values in JavaFx Label在 JavaFx 标签中显示变化的值
【发布时间】:2012-11-05 07:32:54
【问题描述】:

在 JavaFX 中,如何使用“标签”显示随时间不断变化的值?

【问题讨论】:

    标签: java javafx-2 javafx-8


    【解决方案1】:

    有很多方法可以实现,最方便的是使用JavaFX的DataBinding机制:

    // assuming you have defined a StringProperty called "valueProperty"
    Label myLabel = new Label("Start");
    myLabel.textProperty().bind(valueProperty);
    

    这样,每次调用 set 方法更改 valueProperty 时,标签的文本都会更新。

    【讨论】:

      【解决方案2】:

      使用 SimpleDateFormat 怎么样? 不需要 StringUtilities 类!

      private void bindToTime() {
        Timeline timeline = new Timeline(
          new KeyFrame(Duration.seconds(0),
            new EventHandler<ActionEvent>() {
              @Override public void handle(ActionEvent actionEvent) {
                Calendar time = Calendar.getInstance();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
                setText(simpleDateFormat.format(time.getTime()));
              }
            }
          ),
          new KeyFrame(Duration.seconds(1))
        );
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
       }
      }
      

      【讨论】:

        【解决方案3】:

        我喜欢塞巴斯蒂安的有约束力的回答。

        为了多样化,这里是另一个根据时间修改标签文本的示例。该示例在标签中显示数字时钟读数,其文本使用Timeline 每秒更改。

        import java.io.IOException;
        import java.net.URL;
        import javafx.animation.*;
        import javafx.event.*;
        import javafx.scene.control.Label;
        import javafx.util.Duration;
        
        import java.util.Calendar;
        import javafx.application.Application;
        import javafx.scene.Scene;
        import javafx.stage.Stage;
        
        public class DigitalClockSample extends Application {
          public static void main(String[] args) { launch(args); }
          @Override public void start(Stage stage) throws IOException {
            stage.setScene(new Scene(new DigitalClock(), 100, 50));
            stage.show();
          }
        }
        
        /**
         * Creates a digital clock display as a simple label.
         * Format of the clock display is hh:mm:ss aa, where:
         * hh Hour in am/pm (1-12)
         * mm Minute in hour
         * ss Second in minute
         * aa Am/pm marker
         * Time is the system time for the local timezone.
         */
        class DigitalClock extends Label {
          public DigitalClock() {
            bindToTime();
          }
        
          // the digital clock updates once a second.
          private void bindToTime() {
            Timeline timeline = new Timeline(
              new KeyFrame(Duration.seconds(0),
                new EventHandler<ActionEvent>() {
                  @Override public void handle(ActionEvent actionEvent) {
                    Calendar time = Calendar.getInstance();
                    String hourString = StringUtilities.pad(2, ' ', time.get(Calendar.HOUR) == 0 ? "12" : time.get(Calendar.HOUR) + "");
                    String minuteString = StringUtilities.pad(2, '0', time.get(Calendar.MINUTE) + "");
                    String secondString = StringUtilities.pad(2, '0', time.get(Calendar.SECOND) + "");
                    String ampmString = time.get(Calendar.AM_PM) == Calendar.AM ? "AM" : "PM";
                    setText(hourString + ":" + minuteString + ":" + secondString + " " + ampmString);
                  }
                }
              ),
              new KeyFrame(Duration.seconds(1))
            );
            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();
          }
        }
        
        class StringUtilities {
          /**
           * Creates a string left padded to the specified width with the supplied padding character.
           * @param fieldWidth the length of the resultant padded string.
           * @param padChar a character to use for padding the string.
           * @param s the string to be padded.
           * @return the padded string.
           */
          public static String pad(int fieldWidth, char padChar, String s) {
            StringBuilder sb = new StringBuilder();
            for (int i = s.length(); i < fieldWidth; i++) {
              sb.append(padChar);
            }
            sb.append(s);
        
            return sb.toString();
          }
        }
        

        数字时钟采样输出:

        【讨论】:

          【解决方案4】:

          非常好的回复,感谢 Jewelsea 的投入,这对我帮助很大。

          我使用Java 8 以更精简的格式更新了之前发布的 DigitalClock。使用 Java 8 的附加功能,例如 Date API,当然还有 lambdas

           import javafx.animation.Animation;
           import javafx.animation.KeyFrame;
           import javafx.animation.Timeline;
           import javafx.scene.control.Label;
           import javafx.util.Duration;
          
           import java.time.LocalTime;
           import java.time.format.DateTimeFormatter;
          
           public class DigitalClock extends Label
           {
              private static DateTimeFormatter SHORT_TIME_FORMATTER =       DateTimeFormatter.ofPattern("HH:mm:ss");
          
              public DigitalClock()
              {
                  bindToTime();
              }
          
              private void bindToTime() {
                  Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(0),
                                                                event -> setText(LocalTime.now().format(SHORT_TIME_FORMATTER))),
                                                   new KeyFrame(Duration.seconds(1)));
          
                  timeline.setCycleCount(Animation.INDEFINITE);
                  timeline.play();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-23
            • 2015-06-21
            • 1970-01-01
            • 2017-01-30
            • 1970-01-01
            相关资源
            最近更新 更多