JavaFX JavaFX Border zuweisen

MaxG.

Bekanntes Mitglied
Hi,
ich bin gerade dabei einen Audio Player in JavaFX zu programmieren. Bis auf ein paar Schönheitsfehler läuft die Anwendung auch. Einer dieser Schönheitsfehler ist das ein paar Meiner Buttons ganz unten am Rand kleben. Um zwischen Buttons und Rand platz zu lassen hatte ich mir gedacht dass ich einen Border um meine Komponente mache, hat aber nichts gebracht.
Wie muss ich den Border zuweisen oder gibt es bessere Methoden?

Hier mein bisheriger Code:
Im Code sind noch Variable Leichen die für spätere zwecke gedacht sind.
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package audioplayer;

import java.awt.GridBagConstraints;
import java.io.File;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Dialog;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.ProgressBar;
import javafx.scene.control.Slider;
import javafx.scene.image.Image;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.FileChooser;
import javafx.stage.Screen;

/**
*
* @author GROHMANN
*/
public class AudioPlayer extends Application {

    Button playButton;
    Button pauseButton;
    Button muteButton;

    Slider volumeControll;
    Slider audioProgress;
   
    Label fileName;
    Label durationTime;

    FileChooser fileChooser;

    MenuBar menuBar;
    Menu menuFile;
    MenuItem openAudio;
    MenuItem reloade;

    BorderPane content;
    HBox controllPanel;
    StackPane audioInfos;
    GridPane audioInfoComponents;

    String audioPath;
    double volume = 50;
    double duration;

    MediaPlayer mediaPlayer;
    Media hit;

    @Override
    public void start(Stage stage) {
        stage.setTitle("Open Audio Player");

        //New Layout Objects
        content = new BorderPane();
        controllPanel = new HBox();
        audioInfos = new StackPane();
        audioInfoComponents = new GridPane();

        // GUI Objects
        fileChooser = new FileChooser();

        playButton = new Button();
        playButton.setText("Play");

        pauseButton = new Button();
        pauseButton.setText("Pause");

        muteButton = new Button();
        muteButton.setText("Mute");
       
        fileName = new Label();
        durationTime = new Label();

        volumeControll = new Slider(0, 100, 50);

        audioProgress = new Slider();
        audioProgress.setMinSize(300, 25);

        menuBar = new MenuBar();

        menuFile = new Menu("Datei");

        openAudio = new MenuItem("Open a audiofile");
        reloade = new MenuItem("Reloade");

        menuFile.getItems().add(openAudio);
        menuFile.getItems().add(reloade);

        menuBar.getMenus().addAll(menuFile);

        //Layout controll
        content.setStyle("-fx-background-color: #a8a8a8;");

        controllPanel.setSpacing(10);
       

        //GUI controll
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("AudioFiles (*.mp3, *wav)", "*.mp3", "*.wav");
        fileChooser.getExtensionFilters().add(extFilter);


        Screen screen = Screen.getPrimary();
        javafx.geometry.Rectangle2D bounds = screen.getVisualBounds();

        stage.setX(bounds.getMinX());
        stage.setY(bounds.getMinY());
        stage.setWidth(bounds.getWidth());
        stage.setHeight(bounds.getHeight());
        stage.getIcons().add(new Image(AudioPlayer.class.getResourceAsStream("music-icon.png")));
        Scene scene = new Scene(new Group());

        controllPanel.setAlignment(Pos.CENTER);
        controllPanel.getChildren().addAll(playButton, pauseButton, muteButton, volumeControll);
        audioInfoComponents.add(fileName, 0, 0);
        audioInfoComponents.add(audioProgress, 1, 0);
        audioInfoComponents.add(durationTime, 1, 1);
        audioInfos.getChildren().add(audioInfoComponents);
        content.setTop(menuBar);
        content.setBottom(controllPanel);
        content.setCenter(audioInfos);

        scene.setRoot(content);
        stage.setScene(scene);
        stage.show();

        listener();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

    public void listener() {
        playButton.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) throws NullPointerException {

                if(audioPath.equals(null)){
                    System.out.println(audioPath);
                }else{
                    System.out.println(audioPath);
                    System.out.println("Play Audio");
                    mediaPlayer.play();
                }
               

            }
        });

        pauseButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) throws NullPointerException {

                mediaPlayer.pause();

            }
        });

        muteButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) throws NullPointerException {

                volumeControll.setValue(0);
                mediaPlayer.setVolume(volume/100);

            }
        });

        openAudio.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) throws NullPointerException {
                fileChooser.setTitle("Open a audiofile");
                audioPath = fileChooser.showOpenDialog(null).getPath().toString();
                System.out.println(audioPath);

                audio();
            }
        });
       
        reloade.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                mediaPlayer.seek(mediaPlayer.getStartTime());
            }
        });

        volumeControll.setOnMouseDragged(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) throws NullPointerException {
                volume = volumeControll.getValue();
                mediaPlayer.setVolume(volume/100);
            }
        });
       
       
    }

    public void audio() throws NullPointerException {
        hit = new Media(new File(audioPath).toURI().toString());
        mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.setVolume(volume/100);
        mediaPlayer.setAutoPlay(true);

    }

}

Den Border hab ich Versucht mit
Java:
content.setBorder(Border.EMPTY);
zuzuweisen.
 
Hab es jetzt mit CSS probiert, den Border zu zeichnen, allerdings bleibt alles unverändert außer das ein Warning kommt:
Code:
Jun 13, 2017 8:08:18 AM com.sun.javafx.css.parser.CSSParser term
WARNING: CSS Error parsing '*{-fx-border-style: hidden-fx-border-width: 5px}: Unexpected token ':' at [1,42]

Mein Code ist folgender:
Code:
controllPanel.setStyle("-fx-border-style: hidden" + "-fx-border-width: 5px");

Was habe ich falsch gemacht?
 
Hallo MaxG,

das verstehe ich auch nicht wirklich mit dem border setzen.

Bisher habe ich es immer über -fx-background-insets: 0 gemacht. Das hat bei mir immer funktioniert.

Grüße
lam
 
@Robat Hab ich schon Ausprobiert, allerdings setzt die Methode
Code:
setSpacing(int i);
nur einen Abstand zwischen den Komponenten innerhalb der Komponente der man das Spacing hinzufügt und nicht zum Rand des Frames, wie ich es gerne hätte.
Dennoch danke für die Antworten.
 
Dann versuch es mal mit controllPanel.setMargin(playButton, new Insets(5,5,5,5); 🙂
Das sollte eigentlich funktionieren 😉
 
1) Ändere
Java:
controllPanel.setStyle("-fx-border-style: hidden" + "-fx-border-width: 5px");
nach
Java:
controllPanel.setStyle("-fx-border-style: hidden; -fx-border-width: 5px");
Und nein: Das bringt auch nicht… 😀

2) Über den allgemeinen Stil lasse ich mich erst einmal nicht aus. Es ist ja nur ein Übungsprojekt und ich hoffe einfach mal, du willst es nicht so lassen…

3) CSS: Verwende CSS… Nicht inline styles - in dem kleinen Programm mag es gehen, später aber wirst du dich selbst dafür hassen.
Also: Die Grundfarbe und "Variablen" kannst du in der Klasse .root ablegen. Basis-Klassen der Komponenten findest du in der Referenz (siehe unten). Idealerweise nutzt du auch eigenen Klassen und IDs und wenn nötig auch Pseudo-Klassen (mal dazu allgemein in CSS belesen).
Die Style-Klassen setzt du über "getStyleClass().add("…")", IDs über "setId("…")" und Pseudo-Klassen google am Besten.
CSS-Referenz: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/doc-files/cssref.html
Die im JDK enthaltene Basis-CSS-Datei modena.css: https://gist.github.com/maxd/63691840fc372f22f470

4) Was du am Ende brauchst, ist folgende Zeile
Java:
BorderPane.setMargin(controllPanel, new Insets(5.0, 5.0, 10.0, 5.0));
Die "10.0" sind der Abstand in Pixel nach unten. Achtung: "Abstand", nicht "Rahmen"!

Dein Programm könnte dann so aussehen:
Java:
package eu.dzim.tests.fx;

import java.io.File;
import java.net.URL;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Slider;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.stage.FileChooser;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class AudioPlayer extends Application {
   
    Button playButton;
    Button pauseButton;
    Button muteButton;
   
    Slider volumeControll;
    Slider audioProgress;
   
    Label fileName;
    Label durationTime;
   
    FileChooser fileChooser;
   
    MenuBar menuBar;
    Menu menuFile;
    MenuItem openAudio;
    MenuItem reloade;
   
    BorderPane content;
    HBox controllPanel;
    StackPane audioInfos;
    GridPane audioInfoComponents;
   
    String audioPath;
    double volume = 50;
    double duration;
   
    MediaPlayer mediaPlayer;
    Media hit;
   
    @Override
    public void start(Stage stage) {
        stage.setTitle("Open Audio Player");
       
        // New Layout Objects
        content = new BorderPane();
        controllPanel = new HBox();
        audioInfos = new StackPane();
        audioInfoComponents = new GridPane();
       
        // GUI Objects
        fileChooser = new FileChooser();
       
        playButton = new Button();
        playButton.setText("Play");
       
        pauseButton = new Button();
        pauseButton.setText("Pause");
       
        muteButton = new Button();
        muteButton.setText("Mute");
       
        fileName = new Label();
        durationTime = new Label();
       
        volumeControll = new Slider(0, 100, 50);
       
        audioProgress = new Slider();
        audioProgress.setMinSize(300, 25);
       
        menuBar = new MenuBar();
       
        menuFile = new Menu("Datei");
       
        openAudio = new MenuItem("Open a audiofile");
        reloade = new MenuItem("Reloade");
       
        menuFile.getItems().add(openAudio);
        menuFile.getItems().add(reloade);
       
        menuBar.getMenus().addAll(menuFile);
       
        // Layout controll
        content.setStyle("-fx-background-color: #a8a8a8;");
       
        controllPanel.setSpacing(10);
       
        // GUI controll
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("AudioFiles (*.mp3, *wav)", "*.mp3", "*.wav");
        fileChooser.getExtensionFilters().add(extFilter);
       
        Screen screen = Screen.getPrimary();
        javafx.geometry.Rectangle2D bounds = screen.getVisualBounds();
       
        stage.setX(bounds.getMinX());
        stage.setY(bounds.getMinY());
        stage.setWidth(bounds.getWidth());
        stage.setHeight(bounds.getHeight());
       
        // XXX habe ich nicht, daher ausgeklammert
        // stage.getIcons().add(new Image(AudioPlayer.class.getResourceAsStream("music-icon.png")));
       
        Scene scene = new Scene(new Group());
       
        controllPanel.setAlignment(Pos.CENTER);
        controllPanel.getChildren().addAll(playButton, pauseButton, muteButton, volumeControll);
       
        // XXX Abstand nach unten
        BorderPane.setMargin(controllPanel, new Insets(5.0, 5.0, 10.0, 5.0));
       
        audioInfoComponents.add(fileName, 0, 0);
        audioInfoComponents.add(audioProgress, 1, 0);
        audioInfoComponents.add(durationTime, 1, 1);
        audioInfos.getChildren().add(audioInfoComponents);
        content.setTop(menuBar);
        content.setBottom(controllPanel);
        content.setCenter(audioInfos);
       
        scene.setRoot(content);
       
        // XXX hier das CSS als URL verlinken
        URL cssUrl = getClass().getResource("/absolute/path/to/style.css");
        if (cssUrl != null) { // bedeutet: wenn es im classpath existiert
            scene.getStylesheets().add(cssUrl.toExternalForm());
        }
       
        listener();
       
        stage.setScene(scene);
        stage.show();
    }
   
    /**
     * @param args
     *            the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
   
    public void listener() {
        playButton.setOnAction(event -> {
            if (audioPath.equals(null)) {
                System.out.println(audioPath);
            } else {
                System.out.println(audioPath);
                System.out.println("Play Audio");
                mediaPlayer.play();
            }
        });
       
        pauseButton.setOnAction(event -> mediaPlayer.pause());
       
        muteButton.setOnAction(event -> {
            volumeControll.setValue(0);
            mediaPlayer.setVolume(volume / 100);
        });
       
        openAudio.setOnAction(event -> {
            fileChooser.setTitle("Open a audiofile");
            audioPath = fileChooser.showOpenDialog(null).getPath().toString();
            System.out.println(audioPath);
            audio();
        });
       
        reloade.setOnAction(event -> mediaPlayer.seek(mediaPlayer.getStartTime()));
       
        volumeControll.setOnMouseDragged(event -> {
            volume = volumeControll.getValue();
            mediaPlayer.setVolume(volume / 100);
        });
       
    }
   
    public void audio() throws NullPointerException {
        hit = new Media(new File(audioPath).toURI().toString());
        mediaPlayer = new MediaPlayer(hit);
        mediaPlayer.setVolume(volume / 100);
        mediaPlayer.setAutoPlay(true);
    }
}
 

Zurück
Oben