2016-06-14 91 views
1

我刚开始使用javafx,我想创建一个TableView,其中有3列,可以显示一些值。 我创建了TableView,并将场景编辑器的列创建为fxml文件。 然后,我创建了一个名为Values的类,并将其与我们匹配的列的特殊属性匹配。 最后,我将可观察列表中的“Value”对象设置为表格的项目。当我启动应用程序时,它只显示一个空表。 我在网上看上去像4个小时,现在仍然没有找到答案,为什么这不适合我。JavaFX不可能填充表格视图

这里我的代码:

值类:

public class Values { 
    public SimpleDoubleProperty PSI = new SimpleDoubleProperty(0); 
    public SimpleDoubleProperty ALPHA = new SimpleDoubleProperty(0); 
    public SimpleDoubleProperty DELTA = new SimpleDoubleProperty(0); 

    public Values(Double _PSI, Double _ALPHA, Double _DELTA) { 
     setPSI(_PSI); 
     setALPHA(_ALPHA); 
     setDELTA(_DELTA); 
    } 

    private void setPSI(Double p){ 
     PSI.set(p); 
    } 
    private void setALPHA(Double p){ 
     ALPHA.set(p); 
    } 
    private void setDELTA(Double p){ 
     DELTA.set(p); 
    } 

} 

控制器:

@FXML Label psi; 
@FXML Label alpha; 
@FXML Label delta; 


@FXML TextField betafield; 
@FXML TextField lambdafield; 
@FXML TextField lambdasatfield; 

@FXML TableView<Values> table; 
@FXML ObservableList<Values> oblist; 
@FXML TableColumn <Values,Double> psicolumn; 
@FXML TableColumn <Values,Double> alphacolumn; 
@FXML TableColumn <Values,Double> deltacolumn; 

@Override 
public void initialize(URL location, ResourceBundle resources) { 
    psicolumn.setCellValueFactory(new PropertyValueFactory<Values, Double>("PSI")); 
    alphacolumn.setCellValueFactory(new PropertyValueFactory<Values, Double>("ALPHA")); 
    deltacolumn.setCellValueFactory(new PropertyValueFactory<Values, Double>("DELTA")); 
} 

@FXML 
protected void buttonpressed(){ 
    try { 
     Calculation cal = new Calculation(Double.parseDouble(betafield.getText()), Double.parseDouble(lambdafield.getText()), Double.parseDouble(lambdasatfield.getText())); 
     alpha.setText("Alpha: " + " " + cal.calculateAlpha()); 
     delta.setText("Delta:"+ " " + cal.calculateDelta()); 
     psi.setText("Psi:"+ " " + cal.calculatePSI()); 
     table.setItems(FXCollections.observableArrayList(cal.calculateEvaluaiontable())); 
    }catch (NullPointerException e){ 
     e.printStackTrace(); 
    } 
} 

而且我FXML:

<Tab text="tab" fx:id="tabe"> 
    <content> 
    <AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0"> 
     <children> 
      <TableView layoutX="4.0" layoutY="4.0" prefHeight="192.0" prefWidth="370.0" fx:id="table"> 
       <columns> 
        <TableColumn prefWidth="120.0" text="PSI" fx:id="psicolumn" /> 
        <TableColumn prefWidth="120.0" text="ALPHA" fx:id="alphacolumn" /> 
        <TableColumn prefWidth="120.0" text="DELTA" fx:id="deltacolumn" /> 
       </columns> 
      </TableView> 
     </children> 
     </AnchorPane> 
    </content> 
</Tab> 

感谢您的帮助!

+1

您需要具有正确名称的值获取者或属性获取者。查看链接的问题以获得详细的答案 – Itai

+0

@sillyfly谢谢你的回答。我检查了另一个主题并稍微改了一下我的代码,但是它并没有解决我的问题 –

+1

如果您确定您的代码获得者名称正确并且仍然无效,请使用更正后的代码更新您的问题。 – Itai

回答

2

<name>表示PropertyValueFactory的构造函数参数,并让<Name>表示相同的String,但大写的第一个字母。

PropertyValueFactory可以从以下来源之一获得的值:

  1. 属性getter,即一个方法SomeObservableValue <name>Property()
  2. 吸气剂方法,即方法SomeType get<Name>()

您的Values类中没有这些类。

对于psicolumn的工作,Values需要一个DoubleProperty PSIProperty()方法或double getPSI()方法。 (与其他列相同的问题)

+0

想通了!谢谢! –