【问题标题】:SwingNode contents not resizing when the SwingNode's parent resizes当 SwingNode 的父级调整大小时,SwingNode 内容未调整大小
【发布时间】:2018-03-10 12:31:17
【问题描述】:

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


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

问题是,当我“停靠”和“取消停靠”选项卡或只是调整窗口或窗口内窗格的大小时,其中包含表格的 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);
}

}

【问题讨论】:

    标签: java swing javafx


    【解决方案1】:

    事实证明,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 调整大小问题而受阻的人,因为我认为它现在不是特别可搜索的。

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2013-12-19
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2010-10-26
      相关资源
      最近更新 更多