2017-09-28 35 views
6

EDIT: Tôi đã để lại câu hỏi ban đầu của mình như dưới đây. Nếu bạn muốn kiểm tra vấn đề bằng cách sử dụng mã nguồn AnchorFX và mã của tôi bên dưới, bạn sẽ có thể tạo lại sự cố. Nó cũng xảy ra trong một số trường hợp khác, và tương tự như các vấn đề trong hai câu hỏi này: Resize SwingNode in PaneHow to resize Swing control which is inside SwingNode in JavaFX8? Không có câu trả lời nào hữu ích cho tôi, nhưng có lẽ câu trả lời tôi tìm thấy sẽ giúp người khác trong tương lai.Nội dung SwingNode không thay đổi kích thước khi phụ huynh của SwingNode đổi kích thước


Tôi có một JTable bên trong một JScrollPane và tôi cần phải nhúng nó vào một ứng dụng JavaFX. Tôi đang cố gắng thực hiện việc này bằng cách sử dụng AnchorFX docking framework. Tôi cũng cần SwingNode này bằng cách nào đó được bên trong một Control (hai tôi đã thử là ScrollPaneSplitPane) để tôi có thể thêm một ContextMenu vào nó phù hợp với phần còn lại của ứng dụng.

Vấn đề là khi tôi 'neo' và 'hoàn tác' các tab hoặc đơn giản thay đổi kích thước cửa sổ hoặc các ô bên trong cửa sổ, JScrollPane với bảng trong đó không thay đổi kích cỡ đúng cách.

tôi đã sửa đổi một trong những bản demo từ dự án AnchorFX để hiển thị vấn đề của tôi:

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

} 

Trả lời

5

Vì vậy, nó quay ra, SwingNode có một phụ huynh thay đổi kích thước riêng của mình một cách thích hợp, nhưng SwingNode bản thân đã không thay đổi kích thước, nó có kích thước dựa trên nội dung của nó. Tôi giải quyết điều này bằng cách làm cho các cuộc gọi sau khi một DockNode đã cập cảng hoặc undocked:

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

Tôi không hoàn toàn chắc chắn tại sao đặt lại nội dung của SwingNode giúp giải quyết nó, nhưng nó dường như giúp vì vậy tôi để lại dòng đó đó.

Tôi có thể chỉnh sửa câu hỏi sau để giúp bất kỳ ai khác bị cản trở bởi các vấn đề thay đổi kích thước SwingNode lạ, vì tôi không nghĩ rằng nó đặc biệt có thể tìm kiếm ngay bây giờ.

Các vấn đề liên quan