【问题标题】:TableView content not showing [duplicate]TableView 内容未显示 [重复]
【发布时间】:2018-09-22 16:29:20
【问题描述】:

我有一个表格视图,其中填充了信息,但是虽然我可以选择包含数据的行,但文本是不可见的。使用table.getSelectionModel().getSelectedItem();,我可以确认表格内部确实有元素,但文本没有显示出来。

我的程序中有一个 Socket 通信,服务器向客户端发送一个 ArrayList 元素,客户端需要在 TableView 中显示这些元素。

服务器端:

private void acceptedConnection(Socket client, Connection con){
    try(ObjectInputStream ois = new ObjectInputStream(client.getInputStream());
        ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream())){
        System.out.println("receiving request");

        String table = ois.readUTF();

        System.out.println("Preparing statement");
        PreparedStatement getTableContent = con.prepareStatement("SELECT * from " + table);

        System.out.println("Fetching results");
        ResultSet tableContentRs = getTableContent.executeQuery();

        Builder builder = null;

        switch (table){
            case "blog_user": builder = new UserBuilder();break;
        }

        assert builder != null;
        ArrayList tableContent = builder.buildArrayList(tableContentRs);


        System.out.println("Sending results");
        oos.writeObject(tableContent);
        oos.flush();
        System.out.println("Results sent");
    }catch (IOException | SQLException e){
        e.printStackTrace();
    } finally {
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端:

public void loadTableContent(){
    try (Socket client = new Socket(InetAddress.getLocalHost(), 667);
         ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream());
         ObjectInputStream ois = new ObjectInputStream(client.getInputStream())) {

        System.out.println("Sending request");
        String selectedTable = databaseTableComboBox.getSelectionModel().getSelectedItem();
        oos.writeUTF(selectedTable);
        oos.flush();

        table.getColumns().clear();
        table.getItems().clear();

        ArrayList data = null;
        Builder builder = null;
        switch (selectedTable){
            case "blog_user": builder = new UserBuilder();data = (ArrayList<User>)ois.readObject();break;
        }

        assert builder != null;
        builder.setColumns(table);
        table.getItems().addAll(data);
        table.refresh();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}

用户构建器:

public class UserBuilder implements Builder {
    @Override
    public ArrayList buildArrayList(ResultSet set) throws SQLException {
        ArrayList<User> users = new ArrayList<>();
        while (set.next()) users.add(new User(set.getInt(1), set.getString(2), set.getString(3)));
        return users;
    }

    @Override
    public void setColumns(TableView table) {
        TableColumn<User, String> idCol = new TableColumn<>("ID");
        TableColumn<User, String> nameCol = new TableColumn<>("Name");
        TableColumn<User, String> pwdCol = new TableColumn<>("Passwort");

        idCol.setCellValueFactory(new PropertyValueFactory<>("id"));
        nameCol.setCellValueFactory(new PropertyValueFactory<>("username"));
        pwdCol.setCellValueFactory(new PropertyValueFactory<>("pwd"));

        table.getColumns().addAll(idCol, nameCol, pwdCol);
    }
}

和用户:

public class User implements Serializable{
    private int id;
    private String username;
    private String pwd;

    public User(int id, String username, String pwd) {
        this.id = id;
        this.username = username;
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return id + " " + username + " " + pwd;
    }
}

有趣的是,它已经工作过一次,但后来我为其他类(例如 Admin 和 AdminBuilder)添加了与 User 和 UserBuilder 相同的机制,突然文本不再显示在 TableView 中。

非常感谢任何和所有帮助。

【问题讨论】:

    标签: java sockets javafx tableview


    【解决方案1】:

    您的 User 类需要 getter 方法。 PropertyValueFactory 需要访问这些字段。

    public class User {
        private final int id;
        private final String username;
        private final String pwd;
    
        public User(int id, String username, String pwd) {
            this.id = id;
            this.username = username;
            this.pwd = pwd;
        }
    
        @Override
        public String toString() {
            return id + " " + username + " " + pwd;
        }
    
        public int getId() {
            return id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public String getPwd() {
            return pwd;
        }
    
    }
    

    【讨论】:

    • 谢谢你成功了。我之前删除了我的吸气剂,因为我认为我不需要它们。
    猜你喜欢
    • 2016-09-02
    • 2015-12-15
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2018-01-02
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多