当前位置: 首页 > 知识库问答 >
问题:

FXML TableView单元格中的硬代码值JavaFX

丁阳炎
2023-03-14

我一直在疯狂地寻找答案。是否可以在FXML TableView中定义硬编码值?我要硬编码的部分是第一列。

<TableView fx:id="calendarPopulator" layoutX="13.0" layoutY="125.0" prefHeight="282.0" prefWidth="474.0">
        <columns>
            <TableColumn editable="false" prefWidth="43.0" text="Tid">
                <cellValueFactory>
                    <PropertyValueFactory property="Hi"/>
                </cellValueFactory>
            </TableColumn>
            <TableColumn fx:id="mandagColumn" editable="false" prefWidth="81.2" sortable="false" text="Mandag" />
            <TableColumn fx:id="tirsdagColumn" editable="false" prefWidth="81.2" sortable="false" text="Tirsdag" />
            <TableColumn fx:id="onsdagColumn" editable="false" prefWidth="81.2" sortable="false" text="Onsdag" />
            <TableColumn fx:id="torsdagColumn" editable="false" prefWidth="81.2" sortable="false" text="Torsdag" />
            <TableColumn fx:id="fredagColumn" editable="false" prefWidth="81.2" sortable="false" text="Fredag" />
        </columns>
      </TableView>

共有1个答案

束俊英
2023-03-14

只需在控制器中执行此操作。将fx:id添加到列:

<TableColumn fx:id="tidColumn" editable="false" prefWidth="43.0" text="Tid" />

然后在控制器中:

public class Controller {
    @FXML
    private TableColumn<Something, String> tidColumn ;

    public void initialize() {
        tidColumn.setCellValueFactory(cellData -> new ReadOnlyStringWrapper("Hi"));
    }
}

如果您希望能够在FXML文件中定义“固定”值,我认为您将需要在单独的类中创建单元格值工厂实现。例如:

package application;
import javafx.beans.NamedArg;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.util.Callback;


public class FixedValueCellFactory<T> implements Callback<CellDataFeatures<?,T>, ObservableValue<T>> {

    private final ObservableValue<T> valueWrapper ;

    public FixedValueCellFactory(@NamedArg("value") T value) {
        this.valueWrapper = new ReadOnlyObjectWrapper<>(value) ;
    }

    @Override
    public ObservableValue<T> call(CellDataFeatures<?, T> param) {
        return valueWrapper ;
    }

}

则可以在FXML中执行以下操作:

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

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TableColumn?>
<?import application.FixedValueCellFactory?>
<?import javafx.scene.control.cell.PropertyValueFactory?>

<BorderPane xmlns:fx="http://javafx.com/fxml/1" >
    <center>
        <TableView fx:id="table">
            <columns>
                <TableColumn text="fixed">
                    <cellValueFactory>
                        <FixedValueCellFactory value="Hi"/>
                    </cellValueFactory>
                </TableColumn>
                <TableColumn text="Name">
                    <cellValueFactory>
                        <PropertyValueFactory property="name"/>
                    </cellValueFactory>
                </TableColumn>
            </columns>
        </TableView>
    </center>
</BorderPane>

下面是一些测试代码:

package application;

import java.io.IOException;
import java.util.Map;
import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.TableView;
import javafx.stage.Stage;

public class FixedValueCellTest extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("FixedValueTableTest.fxml"));
        primaryStage.setScene(new Scene(loader.load(), 600, 400));

        // should do in controller, this is for brevity:
        Map<String, Object> namespace = loader.getNamespace();
        TableView<Item> table = (TableView<Item>) namespace.get("table");
        IntStream.rangeClosed(1, 20).mapToObj(i -> "Item "+i)
            .map(Item::new).forEach(table.getItems()::add);
        primaryStage.show();
    }

    public static class Item {
        private final StringProperty name = new SimpleStringProperty();
        public Item(String name) {
            setName(name);
        }
        public StringProperty nameProperty() {
            return name ;
        }
        public final String getName() {
            return nameProperty().get();
        }
        public final void setName(String name) {
            nameProperty().set(name);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 问题内容: 在iPython笔记本中,我有一个while循环,可实时侦听串行端口和接收到的数据。 我想要实现的仅显示最新接收到的数据(即,仅一行显示最新数据。在单元格输出区域中不滚动) 我需要的是(我认为)当我收到新数据时清除旧的单元格输出,然后打印新数据。我想知道如何以编程方式清除旧数据? 问题答案: 您可以用来清除单元格的输出。 在此循环结束时,您只会看到一个。 没有代码示例,给您工作代码并不

  • 问题内容: 我不知道如何对齐JTable中单元格的值。 例如,Jtable显示姓名工资X.先生100000.50 XXXX 234.34 YYYy 1205.50 我想以以下格式对齐“薪水”。 如何在JTable上方对齐 问题答案: 无需为此创建自定义类,只需使用默认渲染器即可: 或者更好的方法是在表中实际存储Double值,然后使用适当的数字渲染器,数字渲染器将自动右对齐。然后,您可以使用表格格

  • 我有一个GridPane,如下所示: 我想通过代码合并网格中心的3列,但我找不到这样做的方法。有一个如何通过场景构建器实现这个的参考,但是我不用场景构建器。 有人知道如何合并它们吗?

  • 问题内容: 当我读取excel数字单元格值时,我得到带小数的输出。例如:79读数为79.0,0.00读数为0.0。我编写的应用程序代码是: 问题答案: Stack Overflow上经常出现这个问题,因此建议您仔细阅读许多类似的问题,以找到答案! Excel将文件格式中的几乎所有数字都存储为浮点值,这就是为什么POI会为您返回数字单元格的双精度数字,因为这就是真正的数字。如果希望它看起来像在Exc

  • 1、我希望能够从封闭工作簿的单元格中读取值 算法: > 从关闭的excel文件读取- 需要读取第一行第1列到第200列的整行 变量1等于(A1)的单元格值,其中A1是字符串变量2等于(B1)的单元格值,其中B1是整数变量3等于(c1)的单元格值,其中c1是字符串:::变量200等于(第1行第200列)的单元格值,其中值是字符串 最好的方法是什么? 我应该能穿过100排 你能告诉我吗

  • null 如您所料,A3将导致。现在将A2的格式更改为会计,使用小数点后2位。A2现在读,但是基础值仍然是,所以A3仍然是。 VBA 制作一个新模块并添加以下函数: null 和具有相同的基础值,但和没有,尽管它们都是使用和的方法计算的。 ()中的表达式正在访问和的实际基础值。如何在VBA中访问这些值?