javafx tableview正在添加一个空行数据

时间:2014-06-25 08:03:28

标签: java javafx javafx-2 javafx-8 fxml

我在tableview中添加了一个新行,但它没有显示任何值,我不知道为什么?

代码:

import java.net.URL;
import java.util.ResourceBundle;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableView;

public class TestController implements Initializable {

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    
      @FXML
    private TableView<person> table;

    @FXML
    void add(ActionEvent event) {
   ObservableList<person> data=table .getItems();

   data.add(new person("dsdsd", "sdfsdf"));
    }

    private   class person {
  private final SimpleStringProperty t1= new SimpleStringProperty("");
   private final SimpleStringProperty t2= new SimpleStringProperty("");

        public person(String t1,String t2) {
            set1Name(t1);
          set2Name(t2);
        }

           public String get1Name() {
            return t1.get();
        }

        public void set1Name(String fName) {
            t1.set(fName);
        }
          public String get2Name() {
            return t2.get();
        }

        public void set2Name(String fName) {
            t2.set(fName);
        }
    }
}

FXML

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.cell.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="schoolmanagement2.TestController">
   <children>
      <TableView fx:id="table" layoutX="386.0" layoutY="79.0" prefHeight="200.0" prefWidth="200.0">
        <columns>
          <TableColumn prefWidth="75.0" text="C1">
                    <cellValueFactory>
                      <PropertyValueFactory property="t1" />
                  </cellValueFactory> 
                  </TableColumn>
          <TableColumn prefWidth="75.0" text="C2">
                    <cellValueFactory>
                      <PropertyValueFactory property="t2" />
                  </cellValueFactory> 
                  </TableColumn>
        </columns>
      </TableView>
      <Button layoutX="445.0" layoutY="310.0" mnemonicParsing="false" onAction="#add" text="Button" />
   </children>
</AnchorPane>

我也没有在输出窗口中出现任何错误 请帮我如何在表格视图中添加一行。

谢谢。

1 个答案:

答案 0 :(得分:2)

什么错误

您的问题是您要反思的问题,例如: t1,遵循Java命名约定,person类中没有公共访问方法。

因此,在这种情况下,遵循Java样式约定不仅使您的程序对于用于阅读Java的其他开发人员更具可读性,而且还使其适用于预期的行为。

相关问题

这个问题实际上与Javafx tableview not showing data in all columns重复,但我会在这里另外给出一个答案,因为它值得在FXML中定义PropertyValueFactories的一些评论。

<强>背景

PropertyValueFactory基于使用Java camel case naming conventions反映您的数据类。

请阅读我链接的PropertyValueFactory javadoc,它解释了它如何与样本一起使用。

虽然在驼峰的情况下可能允许使用数字字符,但我并没有真正看到它们使用得太多而且我不确定它们是如何相关的(由于它们既不是大写也不是小写)。因此,我建议替换标识符中的数字字符,在引用的任何位置使用相同数据字段的相同名称,并确保PropertyValueFactory反映所需的方法可公开访问。这将允许您的示例工作。

示例代码

以下是您问题中的代码版本。

所有代码都应放在名为formatter的源包中。

sample

people.fxml

<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="formatter.PeopleTableController">
    <children>
        <TableView fx:id="table" layoutX="386.0" layoutY="79.0" prefHeight="200.0" prefWidth="200.0">
            <columns>
                <TableColumn prefWidth="75.0" text="Given Name">
                    <cellValueFactory>
                        <PropertyValueFactory property="firstName" />
                    </cellValueFactory>
                </TableColumn>
                <TableColumn prefWidth="75.0" text="Surname">
                    <cellValueFactory>
                        <PropertyValueFactory property="surname" />
                    </cellValueFactory>
                </TableColumn>
            </columns>
        </TableView>
        <Button layoutX="445.0" layoutY="310.0" mnemonicParsing="false" onAction="#add" text="Button" />
    </children>
</AnchorPane>

PeopleApp.java

package formatter;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class PeopleApp extends Application {
    @Override
    public void start(Stage stage) throws Exception{
        FXMLLoader loader = new FXMLLoader();

        Pane mainPane = loader.load(
            getClass().getResourceAsStream(
                "people.fxml"
            )
        );

        stage.setScene(
            new Scene(
                mainPane
            )
        );

        stage.show();
    }

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

PeopleTableController.java

package formatter;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;

public class PeopleTableController {

    @FXML
    private TableView<Person> table;

    @FXML
    void add(ActionEvent event) {
        table.getItems().add(new Person("Bill", "Jones"));
    }
}

Person.java

package formatter;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Person {
    private final StringProperty firstName = new SimpleStringProperty("");
    private final StringProperty surname = new SimpleStringProperty("");

    public Person(String firstName, String surname) {
        setFirstName(firstName);
        setSurname(surname);
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String name) {
        this.firstName.set(name);
    }

    public StringProperty firstNameProperty() {
        return firstName;
    }

    public String getSurname() {
        return surname.get();
    }

    public void setSurname(String name) {
        surname.set(name);
    }

    public StringProperty surnameProperty() {
        return surname;
    }
}