java - 当 SwingNode 的父级调整大小时,SwingNode 内容不调整大小

标签 java swing javafx

编辑: 我在下面留下了我原来的问题。如果您希望使用 AnchorFX 源代码和我下面的代码测试问题,您应该能够重现问题。在其他一些情况下也会发生,并且类似于以下两个问题中的问题:Resize SwingNode in PaneHow to resize Swing control which is inside SwingNode in JavaFX8?谁的答案都没有对我有帮助,但也许我找到的答案将来会帮助其他人。


我在 JScrollPane 中有一个 JTable,我需要将它嵌入到 javafx 应用程序中。我正在尝试使用 AnchorFX docking framework 来做到这一点.我还需要这个 SwingNode 以某种方式位于 Control 中(我尝试过的两个是 ScrollPaneSplitPane),这样我就可以添加一个 ContextMenu 到它,这与应用程序的其余部分是一致的。

问题是,当我“停靠”和“取消停靠”选项卡或只是调整窗口或窗口内 Pane 的大小时,其中包含表格的 JScrollPane 无法正确调整大小。

我修改了 AnchorFX 项目中的一个演示以显示我的问题:

public class AnchorFX_substations extends Application {

@Override
public void start(Stage primaryStage) {

    DockStation station = AnchorageSystem.createStation();

    Scene scene = new Scene(station,  1024, 768);

    DockNode node1 = AnchorageSystem.createDock("Node", generateJTableNode());
    node1.dock(station, DockNode.DockPosition.CENTER);

    DockNode subNode = AnchorageSystem.createDock("subNode 1", generateJTableNode());
    subNode.dock(station, DockNode.DockPosition.LEFT);
    subNode.floatableProperty().set(false);

    DockNode subNode2 = AnchorageSystem.createDock("subNode 2", generateJTableNode());
    subNode2.dock(station, DockNode.DockPosition.LEFT);

    AnchorageSystem.installDefaultStyle();

    primaryStage.setTitle("AnchorFX SubStation");
    primaryStage.setScene(scene);
    primaryStage.show();
}

private Control generateJTableNode() {
    ScrollPane contextMenuPane = new ScrollPane();
    SwingNode swingNode = new SwingNode();
    DefaultTableModel model = new DefaultTableModel(); 
    JTable table = new JTable(model); 

    // Create a couple of columns 
    model.addColumn("Col1"); 
    model.addColumn("Col2"); 

    // Append a row 
    for(int i = 0; i < 200; i++) {
        model.addRow(new Object[]{"col 1 row " + i, "col 2 row "+i});
    }
    JScrollPane scrollPane = new JScrollPane(table);
    swingNode.setContent(scrollPane);
    contextMenuPane.setFitToHeight(true);
    contextMenuPane.setFitToWidth(true);
    contextMenuPane.setContent(swingNode);
    return contextMenuPane;
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

最佳答案

事实证明,SwingNode 有一个适当调整自身大小的 Parent,但 SwingNode 本身并没有调整大小,而是根据其内容调整大小。我通过在停靠或取消停靠 DockNode 时进行以下调用来解决此问题:

swingNode.setContent(swingNode.getContent());
int width = (int) swingNode.getParent().getBoundsInParent().getWidth();
int height = (int) swingNode.getParent().getBoundsInParent().getHeight();
swingNode.getContent().setPreferredSize(new Dimension(width, height));

我不完全确定为什么重置 SwingNode 的内容有助于解决它,但它似乎有帮助,所以我将那一行留在那里。

稍后我可能会编辑这个问题,以帮助其他因奇怪的 SwingNode 大小调整问题而受阻的人,因为我认为它现在不是特别可搜索的。

关于java - 当 SwingNode 的父级调整大小时,SwingNode 内容不调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46474641/

相关文章:

javascript - 从 url 中删除 webjars 版本

java - JAX-WS 中的 HTTP 连接重用

java - JScrollPane 内使用 <html> 标签自动换行 JLabel - 删除水平栏功能/逻辑

java - 将数据写入 JavaFX Tableview

java - 在 fxml 布局中使用常量

java - 使用谷歌地图获取 Activity 和 fragment 之间的数据

java - 如何让我的应用程序在 Android 中等待?

Java 面板无法绘制

java - 更改菜单栏和菜单项字体

javafx tableview 检测任何行的任何更改,包括添加新行