2017-04-04 63 views
1

我有一個奇怪的GUI問題。我正在使用JavaFX來創建應用程序。該應用程序有不同的頁面,每個頁面都有一個標題,標籤和tableView。我們關注歡迎頁面。如果我只添加一個tableView到我的vbox,一切都顯得很正常。爲什麼不可見的TableView會遮蓋標籤?

vbox.getChildren().addAll(title, subtitle, reqTable); 

但是,當我添加所有三個tableViews,標題下面的標籤被截斷。表格甚至不可見!

vbox.getChildren().addAll(title, subtitle, reqTable, tempTable, ontTable); 

任何想法爲什麼會發生這種情況?這是我的完整代碼。謝謝!

package FLOOR; 

// --- Imports 
import javafx.application.Application; 
import javafx.beans.property.StringProperty; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 

// --- Main Class 
public class Example extends Application { 

    // --- All Pages 
    final Page[] pages = new Page[] { 
     new Page("Welcome!", 
       "Use the File menu to... \n"), 
     }; 

    // --- All Tables 
    TableView<ObservableList<StringProperty>> reqTable = new TableView<>(); 
    TableView<ObservableList<StringProperty>> tempTable = new TableView<>(); 
    TableView<ObservableList<StringProperty>> ontTable = new TableView<>(); 

    // --- Current Page 
    final Label title = new Label(); 
    final Label subtitle = new Label(); 

    // --- Main 
    public static void main(String[] args) { 
     launch(args); 
    } 

    // --- Start 
    @Override 
    public void start(Stage stage) { 
     // --- Stage & Scene 
     stage.setTitle("APP"); 
     Scene scene = new Scene(new VBox(), 900, 500); 
     MenuBar menuBar = new MenuBar(); 

     // --- VBox 
     final VBox vbox = new VBox(); 
     vbox.setAlignment(Pos.CENTER); 
     vbox.setSpacing(10); 
     vbox.setPadding(new Insets(5, 20, 0, 20)); 
     vbox.getChildren().addAll(title, subtitle, reqTable, tempTable, ontTable); 
     //vbox.getChildren().addAll(title, subtitle, reqTable); 
     reqTable.setVisible(false); 
     tempTable.setVisible(false); 
     ontTable.setVisible(false); 
     reqTable.setMinHeight(300); 
     tempTable.setMinHeight(300); 
     ontTable.setMinHeight(300); 
     reqTable.translateYProperty().set(100); 
     tempTable.translateYProperty().set(-100); 
     ontTable.translateYProperty().set(-300); 

     // --- Welcome Page 
     title.setFont(new Font("Arial", 24)); 
     title.translateYProperty().set(10); 
     title.setText(pages[0].title); 
     subtitle.setText(pages[0].subtitle); 
     subtitle.setMinHeight(10); 

     // --- Menus 
     // --- File Menu 
     // --- Import Submenu 
     Menu menuFile = new Menu("File"); 
     Menu importMenu = new Menu("Import"); 
     MenuItem opt1 = new MenuItem("opt_1"); 
     MenuItem opt2 = new MenuItem("opt_2"); 
     MenuItem opt3 = new MenuItem("opt_3"); 
     importMenu.getItems().addAll(opt1, opt2, opt3); 

     MenuItem export = new MenuItem("Export"); 
     MenuItem exit = new MenuItem("Exit"); 
     menuFile.getItems().addAll(importMenu, export, new SeparatorMenuItem(), exit); 
     menuBar.getMenus().addAll(menuFile); 

     // --- Show 
     ((VBox) scene.getRoot()).getChildren().addAll(menuBar, vbox); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    // Page Class 
    private class Page { 
     public String title; 
     public String subtitle; 
     public Page(String title, String subtitle) { 
      this.title = title; 
      this.subtitle = subtitle; 
     } 
    } 
} 

回答

1

請用這種方式修改代碼,然後檢查。

刪除此行:subtitle.setMinHeight(10);或設置:subtitle.setMinHeight(50);

subtitle.setMinHeight(50); 
+0

那麼,這是令人尷尬的簡單...謝謝! – Ted

0

這個答案是在Keyur寫他的時候寫的。 Keyur的答案是正確的,但考慮到我已經寫了這一切,無論如何,我會張貼:-)


無形的表是不是掩蓋字幕標籤。

您設置字幕的最小高度,以10:

subtitle.setMinHeight(10); 

當沒有足夠的空間來顯示在該優選大小在佈局區域的一切,然後佈局窗格將開始減少的大小裏面的東西,直到達到所有符合最小尺寸的東西。這就是這裏發生的事情,VBox佈局管理器正在將字幕的大小減小到您設置的最小大小。

如果刪除最小高度設置,則字幕標籤不會被截斷。對於這裏所需的最小高度的默認行爲,在所有

subtitle.setMinHeight(Control.USE_PREF_SIZE); 

這有時是有用的,但在這種情況下是不必要的(無設置:

您可以將最小高度設置爲首選高度VBox佈局管理器將爲標籤分配足夠的空間,以便垂直顯示它)。

即使看不到它們,隱形物品仍會佔用佈局空間。想象一下,如果你的房間有一個看不見的玻璃門,而你試圖離開房間,那麼你會打你的頭。它會受傷。我已經做到了。它受傷了。

如果你也不想看不見的節點佔用佈局空間,那麼你需要將其設置爲不受管理,請參閱:


其他佈局的建議

大部分與您的問題沒有直接關係,所以請隨時忽略它。只是一些背景信息。

您已經在使用佈局窗格,其中列出了項目(VBox)。您不應爲置於佈局窗格中的項目設置翻譯值。翻譯值(translateX和translateY)實際上應該是暫時移動東西,例如用於OS X盒式反彈動畫。相反,佈局應該通過layoutX和layoutY值進行管理。當您使用佈局管理器時,佈局管理器負責設置layoutX和layoutY值,因此您不必設置任何翻譯值或佈局值。

相反,您可以在佈局管理器上爲其管理的節點放置佈局約束。例如,對於VBox,要用一定的餘量抵消某些項目,可以使用VBox.setMargin(node)而不是更改翻譯值。設置翻譯值的問題是佈局管理器會忽略它們,因此雖然您可能移動一個節點,但佈局管理器不會自動設置其他受管節點的佈局,並且可能會出現奇怪的重疊問題(儘管這不是問題這不是你在這裏遇到的問題的根源)。

Gluon SceneBuilder是瞭解更多關於JavaFX佈局(即使您不想使用FXML)的好工具。

學習佈局的好例子是Layout sans tears。不幸的是,這個例子有點舊,並且使用了不推薦使用的構建器代碼,但是基本概念仍然有效,並且這些構思很容易轉移到更現代的代碼中。甲骨文也有一個layout tutorial,但遺憾的是它並不全面,其實前景堪憂字想到......

Scenic View是瞭解一個應用程序(和故障排除問題可能與它產生的佈局一個偉大的工具如你在這裏)。

爲防止您的內容尺寸小於其首選尺寸,您可以將其放入ScrollPane,並在內容溢出可用區域(如網頁)時讓用戶滾動。

+0

謝謝,jewelsea!我最近從其他評論中學到了很多,其中很多與TextAreas和RichTextFX有關。 – Ted

+0

再次@jewelsea。我知道這不是管理佈局的正確方法。我試圖根據用戶點擊的menuItem在tableView中顯示某些信息。我找不到只有一個tableView有用的東西,並且每次都要重新填充我想要的數據。所以我採用了多表的方法並顯示/隱藏它們。有關如何使它成爲更清潔的單桌面解決方案的任何想法? – Ted