2017-09-28 62 views
6

EDYCJA: Pozostawiłem moje oryginalne pytanie, jak było poniżej. Jeśli chcesz przetestować problem za pomocą kodu źródłowego AnchorFX i mojego kodu poniżej, powinieneś móc odtworzyć problem. Zdarza się to również w innych okolicznościach i jest podobny do problemów z tych dwóch pytań: Resize SwingNode in Pane i How to resize Swing control which is inside SwingNode in JavaFX8? Żadna z tych odpowiedzi nie okazała się mi pomocna, ale może odpowiedź, którą znalazłem, pomoże komuś innemu w przyszłości.Zawartość SwingNode nie zmienia rozmiaru, gdy rodzic SwingNode zmienia rozmiar


mam JTable Wewnątrz JScrollPane i muszę umieścić go w aplikacji javafx. Próbuję to zrobić przy użyciu AnchorFX docking framework. Też potrzebuję tego SwingNode by być jakoś wewnątrz Control (dwa ja wypróbowałem to ScrollPane i SplitPane) tak, że mogę dodać ContextMenu do tego, który jest zgodny z resztą aplikacji.

Problem polega na tym, że kiedy zakładam "dokowania" i "cofam" zakładki lub po prostu zmieniam rozmiar okna lub paneli w oknie, JScrollPane z tabelą w nim nie zmienia się poprawnie.

zmodyfikowałem jedną z dema z projektu AnchorFX pokazać mój problem:

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

} 

Odpowiedz

5

Tak więc okazuje się, SwingNode ma rodzica, który zmienia rozmiar się odpowiednio, ale SwingNode sama nie była to zmiana rozmiaru, jest sklasyfikowany na podstawie jego zawartości. Rozwiązałem to przez wykonanie następujących połączeń gdy DockNode został zadokowany lub oddokowany:

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

Nie jestem do końca pewien, dlaczego resetowania zawartość tego SwingNode pomogły rozwiązać, ale wydawało się pomóc tak wyjeżdżam tej linii tam.

Mogę edytować pytanie później, aby pomóc każdemu, kto jest w złej kondycji przez dziwne zmiany rozmiaru SwingNode, ponieważ nie sądzę, że jest to teraz szczególnie łatwe do wyszukania.