2014-11-21 34 views
0

我花了很多时间处理这个问题,尝试了不同的解决方案,但没有成功。我想从ViewPart2类发送计数值(按钮点击次数)到ViewPart1类。在ViewPart1中,我想更新标签文本。JavaFx:将值传递给另一个类并更新标签文本

public class Test extends Application { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) throws Exception { 

     BorderPane root = new BorderPane(); 
     Scene scene = new Scene(root, 300, 200); 
     stage.setScene(scene); 
     stage.show(); 

     new ViewPart1().createGui(root); 
     new ViewPart2().createGui(root); 
    } 

} 

public class ViewPart2 { 
    private int count = 0; 

    public void createGui(BorderPane root) { 
     Button btn = new Button("Click me!"); 
     root.setLeft(btn); 

     btn.setOnAction(event -> { 
      count++; 
      new ViewPart1().setCount(count); 
      // how can I send count value to ViewPart1 and update label text 
     }); 

    } 
} 

public class ViewPart1 { 
    private int count; 

    public void createGui(BorderPane root) { 

     Label lbl = new Label("-"); 
     root.setCenter(lbl); 
     lbl.setText(count + "Clicks"); 

    } 

    public void setCount(int count) { 

     this.count = count; 

    } 

} 
+0

你的第一个代码片段中缺少某些东西。有3'}'但只有2'{'。请编辑这个问题。我建议在代码中删除一些emptylines。那么帖子会更简洁。 – rtruszk 2014-11-21 22:09:10

+0

你说得对。我发布了错误的课程,我改变了它,对于这个错误感到抱歉。 – 2014-11-22 09:00:35

回答

0

该解决方案也许是稍微矫枉过正,但你可以创建一个模型类,把它作为两者的输入您的视图类。视图可以修改模型并观察其上的变化。

enter image description here

import javafx.application.Application; 
import javafx.beans.binding.Bindings; 
import javafx.beans.property.*; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

public class Clicker extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     final ClickCounter clickCounter = new ClickCounter(); 

     final ClickInputView inputView = new ClickInputView(clickCounter); 
     final ClickOutputView outputView = new ClickOutputView(clickCounter); 

     VBox layout = new VBox(10, 
       inputView, 
       outputView 
     ); 
     layout.setPadding(new Insets(10)); 
     layout.setAlignment(Pos.CENTER); 

     stage.setScene(new Scene(layout)); 
     stage.show(); 
    } 

    private class ClickCounter { 
     private final ReadOnlyIntegerWrapper numClicks = 
       new ReadOnlyIntegerWrapper(0); 

     public int getNumClicks() { 
      return numClicks.get(); 
     } 

     public ReadOnlyIntegerProperty numClicksProperty() { 
      return numClicks.getReadOnlyProperty(); 
     } 

     public void click() { 
      numClicks.set(getNumClicks() + 1); 
     } 
    } 

    private class ClickInputView extends StackPane { 
     private final Button button = new Button("Click Me!"); 

     public ClickInputView(ClickCounter clickCounter) { 
      button.setOnAction(event -> clickCounter.click()); 

      getChildren().setAll(button); 
     } 
    } 

    private class ClickOutputView extends StackPane { 
     private final Label clickCountLabel = new Label(); 

     public ClickOutputView(ClickCounter clickCounter) { 
      clickCountLabel.textProperty().bind(
        Bindings.format(
          "Clicked %d times", 
          clickCounter.numClicksProperty() 
        ) 
      ); 
      clickCountLabel.setMinWidth(150); 
      clickCountLabel.setAlignment(Pos.CENTER); 

      getChildren().setAll(clickCountLabel); 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

由于模型中的类之间共享它允许视图,以反映改变到公共数据结构,而无需意识到相互的存在的方式。这也意味着模型代码与您的视图代码是分开的,并且可以单独进行测试。

要获得更完整的解决方案,您可以查看基于依赖注入的框架,如afterburner.fx,它们也使用FXML作为视图,将视图定义从Java移出到XML中,并将样式定义移入CSS。