SwingNode的内容在父节点调整大小时未能随之调整大小

7

编辑: 我保留了下面的原始问题。如果您想使用AnchorFX源代码和下面的代码测试该问题,您应该能够重新创建该问题。它在某些其他情况下也会发生,并且类似于这两个问题中的问题:在Pane中调整SwingNode大小如何调整嵌入在JavaFX8 SwingNode中的Swing控件的大小? 他们的答案都没有对我有帮助,但是也许我找到的答案将来会帮助其他人。


我在JScrollPane内部放置了一个JTable,并且需要将其嵌入到javafx应用程序中。我正在尝试使用AnchorFX停靠框架实现此目的。我还需要将此SwingNode放置在Control(我尝试过的两个是ScrollPaneSplitPane)中,以便我可以向其中添加与应用程序的其余部分一致的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);
}

}
1个回答

7

事实证明,SwingNode 有一个父级容器可以自动调整大小,但是 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调整大小问题而受阻的人,因为我认为目前它并不特别容易搜索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接