- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试编写我的第一个 JavaFX 应用程序,它将从套接字解码的消息写入 JavaFX 表中。该表需要是动态的,如果消息包含表中当前不存在的数据,则应添加新列。一些字段嵌套在包装类中,我试图使用嵌套列来表示这些嵌套,如下所示:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm#CJABHBEH
我的问题是我似乎无法获得正确的数据来绑定(bind)到嵌套列。当我尝试为我的 CustomType 绑定(bind)到 PropertyValueFactory("one") 时,我从 MessageType1 获取可选值。我尝试了几种不同的方法,您将在下面的示例中看到:
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
public class SampleTable extends Application {
private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
private final ObservableList<Message> msgList = FXCollections.observableArrayList();
public static void main(final String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
final TableView tableView = new TableView<>(msgList);
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
final TableColumn<Message, MessageType> msgTypeCol = new TableColumn<Message, MessageType>();
msgTypeCol.setText("Message Type");
msgTypeCol.setCellValueFactory(new PropertyValueFactory<Message, MessageType>("messageType"));
final TableColumn<MessageType1, Optional<Integer>> intCol1 = new TableColumn<MessageType1, Optional<Integer>>();
intCol1.setText("Int1");
intCol1.setCellValueFactory(new PropertyValueFactory<MessageType1, Optional<Integer>>("one"));
final TableColumn<MessageType1, Optional<Integer>> intCol2 = new TableColumn<MessageType1, Optional<Integer>>();
intCol2.setText("Int2");
intCol2.setCellValueFactory(new PropertyValueFactory<MessageType1, Optional<Integer>>("two"));
final TableColumn<MessageType1, Optional<Integer>> intCol3 = new TableColumn<MessageType1, Optional<Integer>>();
intCol3.setText("Int3");
intCol3.setCellValueFactory(new PropertyValueFactory<MessageType1, Optional<Integer>>("three"));
final TableColumn<MessageType2, List<String>> strCol = new TableColumn<MessageType2, List<String>>();
strCol.setText("String List");
strCol.setCellValueFactory(new PropertyValueFactory<MessageType2, List<String>>("list"));
//final TableColumn<MessageType3, Optional<CustomType>> customTypeCol = new TableColumn<MessageType3, Optional<CustomType>>();
final TableColumn customTypeCol = new TableColumn<>();
customTypeCol.setText("Custom Type");
// final TableColumn<CustomType, Boolean> customTypeCol1 = new TableColumn<CustomType, Boolean>();
// customTypeCol1.setText("CT1");
// customTypeCol1.setCellValueFactory(new PropertyValueFactory<CustomType, Boolean>("one"));
// final TableColumn<CustomType, Boolean> customTypeCol2 = new TableColumn<CustomType, Boolean>();
// customTypeCol2.setText("CT2");
// customTypeCol2.setCellValueFactory(new PropertyValueFactory<CustomType, Boolean>("customTwo"));
// final TableColumn<CustomType, Integer> customTypeCol3 = new TableColumn<CustomType, Integer>();
// customTypeCol3.setText("CT3");
// customTypeCol3.setCellValueFactory(new PropertyValueFactory<CustomType,Integer>("customThree"));
final TableColumn<MessageType3, Boolean> customTypeCol1 = new TableColumn<MessageType3, Boolean>();
customTypeCol1.setText("CT1");
customTypeCol1.setCellValueFactory(new PropertyValueFactory<MessageType3, Boolean>("one"));
final TableColumn<MessageType3, Boolean> customTypeCol2 = new TableColumn<MessageType3, Boolean>();
customTypeCol2.setText("CT2");
customTypeCol2.setCellValueFactory(new PropertyValueFactory<MessageType3, Boolean>("customTwo"));
final TableColumn<MessageType3, Integer> customTypeCol3 = new TableColumn<MessageType3, Integer>();
customTypeCol3.setText("CT3");
customTypeCol3.setCellValueFactory(new PropertyValueFactory<MessageType3,Integer>("customThree"));
customTypeCol.getColumns().addAll(customTypeCol1, customTypeCol2, customTypeCol3);
// customTypeCol.setCellValueFactory(new PropertyValueFactory<MessageType3, Optional<CustomType>>("customType"));
// customTypeCol.setCellFactory(
// new Callback<TableColumn<MessageType3, Optional<CustomType>>, TableCell<MessageType3, Optional<CustomType>>>() {
// @Override
// public TableCell<MessageType3, Optional<CustomType>> call(
// final TableColumn<MessageType3, Optional<CustomType>> param) {
// return new TableCell<MessageType3, Optional<CustomType>>() {
// @Override
// protected void updateItem(Optional<CustomType> customType, boolean empty) {
// super.updateItem(customType, empty);
//
// if(!empty) {
// //Tried this but didn't work either
//// final TableColumn<CustomType, Boolean> customTypeCol1 = new TableColumn<CustomType, Boolean>();
//// customTypeCol1.setText("CT1");
//// customTypeCol1.setCellValueFactory(new PropertyValueFactory<CustomType, Boolean>("one"));
//// final TableColumn<CustomType, Boolean> customTypeCol2 = new TableColumn<CustomType, Boolean>();
//// customTypeCol2.setText("CT2");
//// customTypeCol2.setCellValueFactory(new PropertyValueFactory<CustomType, Boolean>("customTwo"));
//// final TableColumn<CustomType, Integer> customTypeCol3 = new TableColumn<CustomType, Integer>();
//// customTypeCol3.setText("CT3");
//// customTypeCol3.setCellValueFactory(new PropertyValueFactory<CustomType,Integer>("customThree"));
// //
// final TableColumn<MessageType3, Boolean> customTypeCol1 = new TableColumn<MessageType3, Boolean>();
// customTypeCol1.setText("CT1");
// customTypeCol1.setCellValueFactory(new PropertyValueFactory<MessageType3, Boolean>("one"));
// final TableColumn<MessageType3, Boolean> customTypeCol2 = new TableColumn<MessageType3, Boolean>();
// customTypeCol2.setText("CT2");
// customTypeCol2.setCellValueFactory(new PropertyValueFactory<MessageType3, Boolean>("customTwo"));
// final TableColumn<MessageType3, Integer> customTypeCol3 = new TableColumn<MessageType3, Integer>();
// customTypeCol3.setText("CT3");
// customTypeCol3.setCellValueFactory(new PropertyValueFactory<MessageType3,Integer>("customThree"));
//
// param.getColumns().addAll(customTypeCol1, customTypeCol2, customTypeCol3);
// }
// }
// };
// }
// });
tableView.getColumns().addAll(msgTypeCol, intCol1, intCol2, intCol3, strCol, customTypeCol);
final Group root = new Group();
primaryStage.setScene(new Scene(root));
root.getChildren().add(tableView);
//Simulate incoming DUMMY Messages
executor.scheduleAtFixedRate(new Runnable() {
private int i = 0;
@Override
public void run() {
switch(i) {
case 0:
msgList.add(new MessageType1());
i++;
break;
case 1:
msgList.add(new MessageType2());
i++;
break;
//System.exit(0);
case 2:
msgList.add(new MessageType3());
i = 0;
break;
}
}
}, 0, 1, TimeUnit.SECONDS);
primaryStage.show();
}
public enum MessageType { TYPE1, TYPE2, TYPE3 };
public interface Message {
MessageType getMessageType();
}
public static final class CustomType {
private final boolean one = true;
private final boolean customTwo = true;
private final int customThree = 3;
public Boolean getOne() { return one; }
public Boolean getCustomTwo() { return customTwo; }
public Integer getCustomThree() { return customThree; }
}
public static final class MessageType1 implements Message {
private final List<Optional<Integer>> intList =
ImmutableList.<Optional<Integer>>of(Optional.of(1),
Optional.of(2),
Optional.<Integer>absent());
@Override
public MessageType getMessageType() { return MessageType.TYPE1; }
public Optional<Integer> getOne() { return intList.get(0); }
public Optional<Integer> getTwo() { return intList.get(1); }
public Optional<Integer> getThree() { return intList.get(2); }
}
public static final class MessageType2 implements Message {
List<String> stringList = ImmutableList.of("one", "two", "three");
@Override
public MessageType getMessageType() { return MessageType.TYPE2; }
public List<String> getList() { return stringList; }
}
public static final class MessageType3 implements Message {
private final Optional<CustomType> obj = Optional.of(new CustomType());
@Override
public MessageType getMessageType() { return MessageType.TYPE3; }
public Optional<CustomType> getCustomType() { return obj; }
}
}
我想问题归结为如何将我的 CustomType 数据绑定(bind)到嵌套列?我尝试的一切似乎都失败了。我的直觉告诉我,这与在插入之前将泛型放在我的 TableColumns 上有关,但我没有看到其他选择。关于如何编写像本例这样的混合数据表,是否有更好的建议?也许我正在以完全错误的方式解决这个问题?
谢谢!
注意:我编写此代码是为了尝试表明我试图完成的任务绝不是“生产”级别。
最佳答案
该问题与嵌套列无关。您正在使用 TableView
作为原始(非参数化)类型。不建议在 Java 中使用原始类型,因为编译器无法检查和确保类型对话以及与所使用的参数类型相关的其他内容。IMO 当使用原始类型时,如果在运行时出现对话错误,JavaFX 会忽略它通过返回 null 来作为无操作操作(具体实现可以从源代码中看到)。更具体地说,每个
new PropertyValueFactory<MessageType3, Boolean>("field")
似乎正在通过当前添加项(MessageType 1,2,3)的反射来查找“getField()”或“fieldProperty()” getter ,而不管列的参数化类型。这就是“PropertyValueFactory(“one”) for my CustomType I am gettingOptions from MessageType1”的原因,因为两个类具有相同的命名 getter。
解决方法可能是:
1) 将 getter 名称更改为表中所示的类之间唯一。
2)使用instanceof
。代码
customTypeCol1.setCellValueFactory(
new PropertyValueFactory<MessageType3, Boolean>("one"));
或多或少相当于:
customTypeCol1.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<MessageType3, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<MessageType3, Boolean> p) {
return new SimpleBooleanProperty(p.getValue().getOne());
}
});
此处列参数化类型不会被忽略,因此在第一次尝试将 MessageType1 项添加到表中时运行此结果会导致 ClassCastException
,因为这里 p.getValue() 将返回 MessageType1。使用 instanceof
将是一种解决方法,
customTypeCol1.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<MessageType3, Boolean>, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<MessageType3, Boolean> p) {
if (p.getValue() instanceof MessageType3) {
return new SimpleBooleanProperty(p.getValue().getOne());
} else {
return null;
}
}
});
<小时/>说了这么多之后,我更喜欢的真正解决方案是定义一个新的数据模型类,该类由 MessageTypes 1、2 和 3 部分的字段组成。构建此数据模型并作为
参数化的源 TableView 。这将有助于其他同事轻松理解代码、进行改进和维护。
关于JavaFX 绑定(bind)到嵌套列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22890132/
我不知道这是不是问这种问题的最佳地点, 我看到一些 JavaFX伙计们,重新标记 一些问题通过替换 javafx来自 javafx-2并采用新的 javafx-8 .它被弃用了还是什么? 编辑 : 不
错误本身: Error:java: invalid flag: --add-modules=javafx.fxml,javafx.graphics,javafx.controls,javafx.bas
这个想法是让一个应用程序在每个显示器上显示两个不同的窗口(阶段),该应用程序应该知道计算机有多少个显示器及其分辨率。 javafx有可能吗? 最佳答案 对于当前版本的 JavaFX (2.2),您可以
我正在将我的项目从 javafx 1.3 转换为 javafx 2.1。但我对 javafx.lang 有疑问包裹。 最佳答案 JavaFX 1.3 lang 包内容被拆分并移至下一个位置: 时长变为
当我尝试将标签添加到 gridpane 中时,如第二张图片所示,它不起作用。我已经尝试了很多东西,比如添加 CSS,但它仍然无法正常工作。为什么第 113 和 114 行不起作用? (opcje.se
我有一个JavaFX ContextMenu分配给滚动面板的鼠标右键单击。它会打开,但在滚动 Pane 外部单击时不会关闭。我可以在滚动 Pane 中添加另一个鼠标事件以将其隐藏,但这只能解决1个问题
我有一个tableview,其中附有一个可观察到的自定义类对象的列表(类类型:SalesInvoiceNetSale)。该表中的所有数据都可以正常显示。可观察列表中的最后一项是总计行(类类型:Sale
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我想知道如何在JavaFX中绘制半圆。我尝试使用Shape和QuadCurve,但无法制作出完美的半圆。 这是我要绘制的图片: 最佳答案 您链接的图片实际上是一个半圆环。您可以通过绘制嵌套的2条圆弧和
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在寻找 JavaFX 支持的图像类型(最新)列表,例如PNG、JPEG、TIFF。不同的搜索引擎没有帮助......知道从哪里开始吗? 更特别的是,我对 16 位灰度图像(不同格式)和罕见的受支持
我希望在 javafx 中让标签每 0.1 秒闪烁一次。文本显示在后台运行的 ImageView gif 的顶部。我将如何去做,或者您对最佳方法有什么建议? 谢谢 最佳答案 @fabian 的解决方案
我需要测试所选项目的值以调用不同的方法,因此我编写了添加侦听器的代码,但是该代码生成语法错误 @FXML private JFXComboBox cmbComp; cmbComp.valuePrope
我正在 Javafx 中编写一个非常简单的应用程序,其中舞台上有一个带有文本框的按钮作为一个场景。现在,我想要的行为是,当我单击按钮时,我可以使用另一个按钮加载另一个场景和舞台上的一个文本框,然后删除
编辑:如果用户单击“删除”以删除 ListView 中的项目,我会弹出一个警告框。它有效,但我希望它能超越原来的舞台。它出现在我的第一台显示器上。有什么方法可以设置警报显示时的位置吗? 请注意,“所有
我想使用 JavaFX 编写一个笔画绘图应用程序。我有一个压敏绘图板,如果能够读取笔的压力和倾斜值,那就太好了。 JavaFX 有一个 API 可以处理鼠标、触摸和滑动输入,但似乎没有任何东西可以产生
我在 JavaFX 中使用条形图和折线图。当我使两个图表大小相同并将它们放在同一位置时,它们完美地相互重叠。我如何使折线图显示在条形图的顶部。 目前我已将它们的不透明度设置为 0.7,这样它们“看起来
此问题与 this 相关。现在我想为字段值等于某个值的行着色。 @FXML private TableView tv_mm_view; @FXML private Ta
我有一个程序,可以生成高度图(0-255 的整数的 2D 数组),并使用 Shape3D“Box”对象为每个“像素”构建 3D View ,其高度与其在高度图中的值成比例。这会创建一个看起来很酷的四四
我想为 JavaFX 创建上下文菜单。这是我测试过的代码。但是由于某种原因,当我右键单击树节点时没有上下文菜单。你能帮我找出我的错误吗。 import java.util.Arrays; import
我是一名优秀的程序员,十分优秀!