Estoy tratando de crear una barra de herramientas personalizada en javafx. Esta barra de herramientas debe ser capaz de mostrar los controles en el centro, en el lado izquierdo y en el lado derecho (tres secciones) de su superficie.
El problema es que no tengo idea de para lograr esto. He leído muchos consejos relacionados con este problema, pero ellos no trabajan para mí o estoy haciendo algo mal…

De todos modos he escrito varios métodos, que representan diferentes maneras de poner en práctica mi barra de herramientas, pero ninguna de ellas funciona correctamente.
Aquí tienes mis intentos:

  1. Utilizando HBox Hgrow propiedad de la primavera. No trabajo.

    public ToolBar createToolBar()
    {
        ToolBar toolBar = new ToolBar();
        Pane emptyPane = new Pane();
        HBox spring = new HBox(emptyPane);
        spring.setHgrow(emptyPane, Priority.ALWAYS);
        toolBar.getItems().addAll(spring, new Label("LABEL"));
        return toolBar;
    }

2.Funciona para la izquierda y a la derecha de la sección, pero, ¿cómo definir el centro de uno?

    public AnchorPane createToolBar2()
    {
        AnchorPane toolBar = new AnchorPane();
        Label leftLabel = new Label("left");
        Label rightLabel = new Label("right");
        toolBar.getChildren().addAll(leftLabel, rightLabel);
        toolBar.setLeftAnchor(leftLabel, 0.0);
        toolBar.setRightAnchor(rightLabel, 0.0);
        return toolBar;
    }
  1. Este enfoque funciona bien para el diseño, pero no puedo escuchar los eventos de izquierda y centro de la sección, ya que estas son cubiertos por la sección de la derecha (StackPane es la razón), por lo que esta solución también es inútil.

    public StackPane createToolBar3()
    {
        StackPane toolBar = new StackPane();
        Button left = new Button("left button");
        Button right = new Button("right button");
        Button center = new Button("center button");
        HBox leftSection = new HBox(left);
        leftSection.setAlignment(Pos.CENTER_LEFT);
        HBox centerSection = new HBox(center);
        centerSection.setAlignment(Pos.CENTER);
        HBox rightSection = new HBox(right);
        rightSection.setAlignment(Pos.CENTER_RIGHT);
        toolBar.getChildren().addAll(leftSection, centerSection, rightSection);
    
        left.setOnAction(event -> System.out.println("left"));
        right.setOnAction(event -> System.out.println("right"));
        center.setOnAction(event -> System.out.println("center"));
        return toolBar;
    }

Métodos anteriores estoy invocando en ese bloque de código:

   @Override
    public void start(Stage stage) {

        BorderPane borderPane = new BorderPane();
        borderPane.setPrefWidth(500);
        borderPane.setPrefHeight(300);
        borderPane.setTop(createToolBar4());
        stage.setScene(new Scene(borderPane));
        stage.show();
    }

Voy a estar agradecido por cualquier ayuda en este asunto.

Eche un vistazo a este post. Puede reemplazar el ImageView, Imagen y VBox en el post con sus respectivos controles.

OriginalEl autor Qbisiek | 2015-06-14

3 Comentarios

  1. 3

    Simplemente utilizar una HBox en lugar de un StackPane. Un StackPane pone Nodos en la parte superior de uno al otro.

    Ver un ejemplo modificado de su tercer intento.

    Otra opción sería el uso de los FX de la Barra de herramientas, similar a cómo jewelsea ya mencionados:

    Ver un ejemplo utilizando una Barra de herramientas.

    Ambos intentos deben ser lo suficientemente flexibles para sus necesidades. Se diferencian en el grado de control que sobre el diseño y cómo muchas de las características que usted puede heredar de la Barra de herramientas estándar.

    Gracias por ejemplos útiles! He probado el enfoque con la extensión de fx de la barra de herramientas y funciona perfectamente 🙂

    OriginalEl autor Oliver Jan Krylow

  2. 7

    Primavera método para la sección Barra de herramientas de alineación funciona muy bien para mí.

    Cómo crear una barra de herramientas con la izquierda, centro y derecha secciones en javaFX?

    import javafx.application.Application;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.*;
    import javafx.stage.Stage;
    
    public class SectionalToolbar extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            final Pane leftSpacer = new Pane();
            HBox.setHgrow(
                    leftSpacer,
                    Priority.SOMETIMES
            );
    
            final Pane rightSpacer = new Pane();
            HBox.setHgrow(
                    rightSpacer,
                    Priority.SOMETIMES
            );
    
            final ToolBar toolBar = new ToolBar(
                    new Button("Good"),
                    new Button("Boys"),
                    leftSpacer,
                    new Button("Deserve"),
                    new Button("Fruit"),
                    rightSpacer,
                    new Button("Always")
            );
            toolBar.setPrefWidth(400);
    
            BorderPane layout = new BorderPane();
            layout.setTop(toolBar);
    
            stage.setScene(
                    new Scene(
                            layout
                    )
            );
            stage.show();
        }
        public static void main(String[] args) { launch(); }
    }  

    Un Barra de herramientas (al menos en el estándar de módena.la hoja de estilo css para Java 8), ya está implementada internamente como una HBox contenedor, lo que se puede usar el HBox.setHgrow método para ajustar la composición interna de las limitaciones de los artículos que se colocan en una barra de herramientas.

    La izquierda y la derecha espaciadores en este ejemplo se implementan como en blanco paneles que se acaba de crecer y reducir hasta ajustar el espacio disponible.

    Si quieres un espaciador que era de un tamaño fijo, en lugar de HBox.setHgrow, usted podría usar algo como:

    leftSpacer.setPrefSize(20); 
    leftSpacer.setMinSize(HBox.USE_PREF_SIZE); 
    leftSpacer.setMaxSize(HBox.USE_PREF_SIZE);
    Gracias por este. He adaptado la solución a FXML. Véase mi respuesta a continuación

    OriginalEl autor jewelsea

  3. 0

    Utilizando FXML en conjunto con @jewelsea respuesta.

    <ToolBar prefHeight="40.0" prefWidth="200.0">
        <items>
            <Button mnemonicParsing="false" text="Good" />
            <Button mnemonicParsing="false" text="Boys" />
            <Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
            <Button mnemonicParsing="false" text="Deserve" />
            <Button mnemonicParsing="false" text="Fruit" />
            <Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
            <Button mnemonicParsing="false" text="Always" />
            <Pane prefWidth="20.0" HBox.hgrow="SOMETIMES" />
        </items>
    </ToolBar>

    OriginalEl autor burntblark

Dejar respuesta

Please enter your comment!
Please enter your name here