2017-09-28 1 views
6

EDIT: J'ai laissé ma question initiale telle quelle, ci-dessous. Si vous souhaitez tester le problème en utilisant le code source AnchorFX et mon code ci-dessous, vous devriez être capable de recréer le problème. Cela se produit également dans d'autres circonstances et ressemble aux questions de ces deux questions: Resize SwingNode in Pane et How to resize Swing control which is inside SwingNode in JavaFX8? Aucune de ses réponses ne m'a été utile, mais peut-être que la réponse que j'ai trouvée aidera quelqu'un d'autre à l'avenir.Le contenu de SwingNode ne se redimensionne pas lorsque le parent du SwingNode est redimensionné


J'ai un JTable dans un JScrollPane et je dois l'intégrer dans une application JavaFX. J'essaie de le faire en utilisant le AnchorFX docking framework. J'ai également besoin de ce SwingNode pour être en quelque sorte dans un Control (les deux que j'ai essayé sont ScrollPane et SplitPane) afin que je puisse y ajouter un ContextMenu qui est cohérent avec le reste de l'application. Le problème est que, lorsque je ancre et déconnecte les onglets ou que je redimensionne simplement la fenêtre ou les volets à l'intérieur de la fenêtre, le JScrollPane avec la table ne se redimensionne pas correctement.

J'ai modifié une des démos du projet AnchorFX pour montrer mon problème:

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); 
} 

} 

Répondre

5

Alors il se trouve, SwingNode a un parent qui se redimensionne de façon appropriée, mais elle-même n'a pas été SwingNode le redimensionnement, il est dimensionné en fonction de son contenu. Je résolu ce problème en faisant les appels suivants lorsqu'un DockNode a été ou non ancrés:

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)); 

Je ne suis pas tout à fait sûr pourquoi remettre à zéro le contenu de SwingNode ont aidé à le résoudre, mais il a semblé aider si je quitte cette ligne Là.

Je peux modifier la question plus tard pour aider quelqu'un d'autre contrecarré par des problèmes de redimensionnement SwingNode étranges, car je ne pense pas que ce soit particulièrement rechercheable en ce moment.