在程序激活时更改美杜莎仪表的maxValue

时间:2018-10-02 18:40:12

标签: java user-interface javafx

我是这个论坛和编程的新手。此外,我的英语水平不是最好的,但我希望您能理解我的意思并帮助我。

我想编写一个GUI并使用JavaFX和medusa-库中的Gauges。我需要做的是在程序运行时更改Gauge的maxValue和minValue。我可以更改值,但“量规”的比例不能正确重新排列刻度。例如,当我创建一个从0到10的表,然后将maxValue设置为100时,该表将所有数字显示为一个主要刻度,并且该表变得不可读。因为找不到解决方法,所以我尝试删除原始的量规并仅创建一个新的量规。

这是我尝试过的(我删除了课程的其余部分,因为它有800多行):

package application;

import eu.hansolo.medusa.Gauge;
import eu.hansolo.medusa.Gauge.SkinType;
import eu.hansolo.medusa.GaugeBuilder;
import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;

public class Controller {

@FXML
StackPane stackPane;

private Gauge gauge;
private Button button;

@FXML
private void initialize() {
    gauge = GaugeBuilder.create().skinType(SkinType.QUARTER).barBackgroundColor(Color.LIGHTGREY)
            .needleColor(Color.RED).decimals(0).valueVisible(true).valueColor(Color.BLACK).title("Stromstärke")
            .unit("[mA]").subTitle("Phase 1").minValue(0).maxValue(10).build();

    stackPane.getChildren().add(gauge);
}

public void setMaxValueGauge(StackPane pStackPane, Gauge pGauge, int intMinValue, int pMaxValue) {
    pStackPane.getChildren().remove(pGauge);
    Gauge newGauge = GaugeBuilder.create().skinType(pGauge.getSkinType()).barBackgroundColor(pGauge.getBarColor())
            .needleColor(pGauge.getNeedleColor()).decimals(0).valueVisible(true).valueColor(Color.BLACK)
            .title(pGauge.getTitle()).unit(pGauge.getUnit()).subTitle(pGauge.getSubTitle()).minValue(intMinValue)
            .maxValue(pMaxValue).build();
    pGauge = null;
    pGauge = newGauge;
    pStackPane.getChildren().add(pGauge);
}

@FXML
public void testButton() {
    setMaxValueGauge(stackPane, gauge, 0, 30);
}

}

The method testButton() is only for testing. When I call testButton() the first time, it works well, but when I use it twice or more, it seems that the old Gauge is not replaced. Instead the new one stacks on top of the old one.

能帮我吗?在设置新的maxValue时,我需要修复刻度的刻度,或者在Stackpane中正确替换旧的Gauge。

1 个答案:

答案 0 :(得分:0)

您似乎在设置最大值上做得太多。

这里是一个MCVE,用于更改maxValue。

import eu.hansolo.medusa.Gauge;
import eu.hansolo.medusa.Gauge.SkinType;
import eu.hansolo.medusa.GaugeBuilder;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;

/**
 *
 * @author blj0011
 */
public class MedusaGaugeTest extends Application
{

    @Override
    public void start(Stage primaryStage)
    {
        Gauge gauge = GaugeBuilder.create().skinType(SkinType.QUARTER).barBackgroundColor(Color.LIGHTGREY)
                .needleColor(Color.RED).decimals(0).valueVisible(true).valueColor(Color.BLACK).title("Stromstärke")
                .unit("[mA]").subTitle("Phase 1").minValue(0).maxValue(10).build();;

        Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), (ActionEvent event) -> {
            if (gauge.getValue() <= gauge.getMaxValue()) {
                gauge.setValue(gauge.getValue() + 1);
            }
        }));
        timeline.setCycleCount(Timeline.INDEFINITE);
        Button btn = new Button();
        btn.setText("Start");
        btn.setOnAction((ActionEvent event) -> {
            timeline.play();
        });

        Button btn2 = new Button();
        btn2.setText("Increase MaxValue");
        btn2.setOnAction((ActionEvent event) -> {
            gauge.setMaxValue(15);
        });

        VBox root = new VBox(gauge, new VBox(btn, btn2));
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}