且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

JavaFX 中 JPanel 的等价物是什么

更新时间:2022-10-21 16:21:16

While Java FX

import javafx.application.Application;导入 javafx.geometry.Insets;导入 javafx.scene.Scene;导入 javafx.scene.control.ContentDisplay;导入 javafx.scene.control.Label;导入 javafx.scene.layout.Background;导入 javafx.scene.layout.BackgroundFill;导入 javafx.scene.layout.Border;导入 javafx.scene.layout.BorderPane;导入 javafx.scene.layout.BorderStroke;导入 javafx.scene.layout.BorderStrokeStyle;导入 javafx.scene.layout.BorderWidths;导入 javafx.scene.layout.CornerRadii;导入 javafx.scene.layout.GridPane;导入 javafx.scene.paint.Color;导入 javafx.scene.shape.Rectangle;导入 javafx.scene.text.Font;导入 javafx.stage.Stage;/*** @see https://***.com/a/37935114/230513*/公共类 BorderTest 扩展应用程序 {private static final Border black = new Border(new BorderStroke(Color.BLACK,BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));private static final Border red = new Border(new BorderStroke(Color.RED,BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));private static final Border blue = new Border(new BorderStroke(Color.BLUE,BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));private static final Color Yellow = Color.YELLOW.deriveColor(0, .9, 1, 1);@覆盖公共无效开始(阶段primaryStage){primaryStage.setTitle("测试");GridPane root = new GridPane();root.setPadding(new Insets(16));root.setVgap(16);root.setBorder(黑色);root.setBackground(新背景(新背景填充(Color.LIGHTGRAY, CornerRadii.EMPTY, Insets.EMPTY)));BorderPane top = new BorderPane();top.setPadding(new Insets(16));top.setBorder(红色);top.setLeft(createLabel("标签 1", 黄色, 16));Label topCenter = createLabel("标签 2", Yellow, 64);topCenter.setContentDisplay(ContentDisplay.CENTER);BorderPane.setMargin(topCenter, new Insets(16));top.setCenter(topCenter);top.setRight(createLabel("标签 3", 黄色, 16));root.add(top, 0, 0);BorderPane bot = new BorderPane();bot.setPadding(新插入(16));bot.setBorder(蓝色);bot.setCenter(createLabel("标签 4", Color.GREEN, 24));root.add(bot, 0, 1);场景场景 = 新场景(根);primaryStage.setScene(场景);primaryStage.show();}私有标签 createLabel(字符串文本,颜色颜色,整数大小){矩形 r = 新矩形(3 * 大小,2 * 大小);r.setFill(颜色.透明);r.setStroke(颜色);r.setStrokeWidth(3);标签 l = 新标签(文本,r);l.setContentDisplay(ContentDisplay.TOP);l.setTextFill(颜色);l.setFont(新字体(16));返回 l;}公共静态无效主(字符串 [] args){发射(参数);}}

I'm still learning and experimenting with GUIs in JavaFX and I cant seem to get the "look" that I'm aiming for.. I'm trying to group a couple of Labels in a Panel and then in a different panel add another Label. But I cant seem to figure out how to properly use "JPanels" in JavaFX?

Any help would be greatly appreciated :D Thanks

EDIT: Here is what I'm trying to achieve by trying different layouts, no luck still

While Java FX Pane is similar to Swing JPanel, the example below uses subclasses of Pane to get various layout effects. In particular,

  • Instead of a JPanel set to GridLayout, use GridPane.

  • Instead of a JPanel set to BoderLayout, use BorderPane.

  • Use ContentDisplay.TOP to position a label's content above its text, as shown here.

  • Use ContentDisplay.CENTER for topCenter to make the label overlay the rectangle; for comparison, a previous version used StackPane.

  • Use setPadding(), setMargin() and setVgap() to spread things out a little.

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.stage.Stage;

/**
 * @see https://***.com/a/37935114/230513
 */
public class BorderTest extends Application {

    private static final Border black = new Border(new BorderStroke(Color.BLACK,
        BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));
    private static final Border red = new Border(new BorderStroke(Color.RED,
        BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));
    private static final Border blue = new Border(new BorderStroke(Color.BLUE,
        BorderStrokeStyle.SOLID, new CornerRadii(8), new BorderWidths(2)));
    private static final Color yellow = Color.YELLOW.deriveColor(0, .9, 1, 1);

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Test");

        GridPane root = new GridPane();
        root.setPadding(new Insets(16));
        root.setVgap(16);
        root.setBorder(black);
        root.setBackground(new Background(new BackgroundFill(
            Color.LIGHTGRAY, CornerRadii.EMPTY, Insets.EMPTY)));

        BorderPane top = new BorderPane();
        top.setPadding(new Insets(16));
        top.setBorder(red);
        top.setLeft(createLabel("Label 1", yellow, 16));
        Label topCenter = createLabel("Label 2", yellow, 64);
        topCenter.setContentDisplay(ContentDisplay.CENTER);
        BorderPane.setMargin(topCenter, new Insets(16));
        top.setCenter(topCenter);
        top.setRight(createLabel("Label 3", yellow, 16));
        root.add(top, 0, 0);

        BorderPane bot = new BorderPane();
        bot.setPadding(new Insets(16));
        bot.setBorder(blue);
        bot.setCenter(createLabel("Label 4", Color.GREEN, 24));
        root.add(bot, 0, 1);

        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Label createLabel(String text, Color color, int size) {
        Rectangle r = new Rectangle(3 * size, 2 * size);
        r.setFill(Color.TRANSPARENT);
        r.setStroke(color);
        r.setStrokeWidth(3);
        Label l = new Label(text, r);
        l.setContentDisplay(ContentDisplay.TOP);
        l.setTextFill(color);
        l.setFont(new Font(16));
        return l;
    }

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