2013-11-12 2 views
4

Я использую Linux Suse 12.3, JDK 1.7.0-45, JavaFX 2.2.JavaFX Заполнить пустое пространство, когда компонент не отображается?

мой вопрос: почему следующий код не работает и как реализовать функцию toggleShow/hide?

вот мой тест Код:

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ToolBar; 
import javafx.scene.layout.AnchorPane; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.HTMLEditor; 
import javafx.stage.Stage; 

public class Test extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(final Stage stage) { 
     AnchorPane root = new AnchorPane(); 


     BorderPane inner = new BorderPane(); 

     AnchorPane.setTopAnchor(inner, 0.0); 
     AnchorPane.setRightAnchor(inner, 0.0); 
     AnchorPane.setBottomAnchor(inner, 0.0); 
     AnchorPane.setLeftAnchor(inner, 0.0); 

     final HTMLEditor center = new HTMLEditor(); 

     final ToolBar top = new ToolBar(); 
     final Button button = new Button("hide"); 
     button.setOnAction(new EventHandler<ActionEvent>() { 
      @Override 
      public void handle(ActionEvent t) { 
       top.setVisible(false); 
       //center.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE); 
      } 
     });  

     center.setManaged(false); 
     top.getItems().add(button); 
     //top.managedProperty().bind(top.visibleProperty()); 
     top.setManaged(false); 

     inner.setTop(top); 
     inner.setCenter(center); 

     root.getChildren().add(inner); 
     Scene scene = new Scene(root,600,400); 
     stage.setScene(scene); 
     stage.show(); 
    } 
} 

то, что я хочу, это тот же эффект, что и решение Сергея к этому вопросу, но без изменения ширины/высоты !:

How to solve the overlapping of the controls each other belonging to two different panes

, как я сказал, что это всего лишь тестовый код. Я попытался использовать другие макеты как BorderPane, но все еще не работал. я не хочу пересчитывать размер вручную ... и т. д. Удаление узла и добавление его снова не является для меня вариантом.

Что не так в моем коде? любая идея приветствуется! благодаря

+0

Что не работает? Что будет означать работа? Что он должен делать и как именно это отличается от того, что он делает? – jewelsea

+0

@jewelsea: Заголовок моего сообщения: JavaFX Заполнить пустое пространство, когда компонент не виден? другими словами, если верхний компонент не отображается, центральный компонент должен иметь полный размер. –

+0

@jewelsea: почему голосование вниз, если вы не читали титул? –

ответ

5

Заполнение пустого пространства с использованием BorderPane, как представляется, не вариант из-за приглашения в его Javadoc:

BorderPane вынимает каждого ребенка установлен в пяти положениях, независимо от ребенка видимым стоимость имущества; неуправляемые дети игнорируются.

Кроме того, использование AnchorPane только для перезначительного содержания, как:

AnchorPane.setTopAnchor(inner, 0.0); 
AnchorPane.setRightAnchor(inner, 0.0); 
AnchorPane.setBottomAnchor(inner, 0.0); 
AnchorPane.setLeftAnchor(inner, 0.0); 

, как представляется, злоупотребляет. Просто использование VBox будет более подходящим для вашего макета.

Переписан код теста:

@Override 
public void start(final Stage stage) { 
    final HTMLEditor center = new HTMLEditor(); 
    final ToolBar top = new ToolBar(); 

    final Button button = new Button("hide"); 
    button.setOnAction(new EventHandler<ActionEvent>() { 
     @Override 
     public void handle(ActionEvent t) { 
      top.setVisible(false); 
      top.setManaged(false); 
     } 
    }); 
    top.getItems().add(button); 

    VBox inner = new VBox(); 
    inner.getChildren().addAll(top, center); 
    Scene scene = new Scene(inner, 600, 400); 
    stage.setScene(scene); 
    stage.show(); 
} 

Теперь вопрос;
Как вы собираетесь реализовать «показную» часть панели «показать/скрыть»? Так как в вашем вопросе нет никакой информации об этом.

+0

спасибо за ваш ответ/советы. это именно то, что они ищут. как я уже сказал, это просто тест, чтобы увидеть, может ли его способность делать такой «эффект». У меня есть приложение, написанное в Swings, и прежде чем переписать его в Fx, я хочу проверить, доступны ли все функции или, может быть, лучше ... и т. д. –

0

Попробуйте удалить top.setManaged(false); линии, а затем положить панель в Group объекта, как это:

Group g = new Group(); 
    Region spacer = new Region(); 
    spacer.setPrefWidth(10000); 
    spacer.setMinWidth(100);  
    top.getItems().add(spacer); 
    g.getChildren().add(top); //Toolbar here... 
    inner.setTop(g); //set Group into Borderpane instead of the toolbar 

После нажатия кнопки свободного пространства потребляемой полностью в HTML-редакторе.