2017-04-04 9 views
1

이상한 GUI 문제가 있습니다. JavaFX를 사용하여 앱을 만들고 있습니다. 이 응용 프로그램에는 제목, 레이블 및 tableView가있는 서로 다른 페이지가 있습니다. 시작 페이지에 초점을 맞추어 보겠습니다. 내 vbox에 tableView를 하나만 추가하면 모든 것이 정상적으로 보입니다.보이지 않는 TableView가 라벨을 덮고있는 이유는 무엇입니까?

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

그러나 세 개의 tableView를 모두 추가하면 제목 아래의 레이블이 잘립니다. 테이블은 아직 보이지 않습니다!

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); 또는 set : subtitle.setMinHeight (50);

subtitle.setMinHeight(50); 
+0

글쎄, 당황스럽게 간단했다 ... 고마워! 감사합니다, jewelsea! – Ted

0

이 대답은 키어가 자신의 글을 쓰는 동안 작성되었습니다. 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은 (FXML을 사용하고 싶지 않더라도) JavaFX 레이아웃에 대해 더 자세히 배우기위한 훌륭한 도구입니다.

레이아웃 학습에 대한 좋은 예는 Layout sans tears입니다. 안타깝게도 예제는 약간 오래되었고 더 이상 사용되지 않는 빌더 코드를 사용하지만 기본 개념은 여전히 ​​유효하며 아이디어는보다 최신 코드로 쉽게 옮겨 갈 수 있습니다. 오라클에도 layout tutorial이 있지만 불행히도 불행히도 woeful이라는 단어는 마음에 들지 않습니다.

Scenic View은 앱의 레이아웃을 이해하고 문제를 일으킬 수있는 문제를 해결하는 훌륭한 도구입니다. 당신이 여기에있는 것처럼).

콘텐츠가 원하는 크기보다 작아지지 않도록하려면 ScrollPane에 넣고 콘텐츠가 웹 페이지처럼 사용 가능한 영역을 오버플로 할 때 사용자가 스크롤하도록합니다.

+0

! 나는 최근에 TextAreas 및 RichTextFX와 관련된 다른 의견으로 많은 것을 배웠습니다. – Ted

+0

안녕하세요 @ jewelsea. 나는 이것이 레이아웃을 관리하는 올바른 방법이 아니라는 것을 알고있었습니다. 사용자가 클릭하는 menuItem을 기반으로 tableView에 특정 정보를 표시하려고합니다. 하나의 tableView 만 가지고 작업 할 수있는 항목을 찾지 못했고 매번 원하는 데이터로 다시 채 웁니다. 그래서 나는 멀티 테이블 접근법을 사용하고 그것들을 보여 주거나 숨겼습니다. 그것을 더 깨끗한 one-tableView 솔루션으로 만드는 방법에 대한 의견이 있으십니까? – Ted