I have a blank javafx.stage.Stage
with no icons minimize, maximize, and close stage.initStyle(StageStyle.UNDECORATED);
. I want to create them myself, because on the line with them will make more Buttons
. Because I use an empty style for the Stage
, I need to set a resizable borders for my window. There are standard ways to do this? Because to create them as a BorderPane
and customize the dragging of the mouse is cumbersome.
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
altered from a project of mine
This is how it looks
when maximised
package Project
Main.class
public class Main extends Application {
double dragX,dragY;
@Override
public void start(Stage primaryStage) {
try {
primaryStage.initStyle(StageStyle.TRANSPARENT);
HBox hbox = new HBox(10.0);
hbox.setPrefHeight(70);
hbox.setFillHeight(true);
BackgroundFill bf = new BackgroundFill(Color.BLUEVIOLET, new CornerRadii(1), null);
hbox.setBackground(new Background(bf));
AnchorPane ap = new AnchorPane();
ResponsiveButton min = new ResponsiveButton("Minimise");
min.noDefaultFill = true;
min.setBorder(Border.EMPTY);
min.setBackground(new Background(new BackgroundFill(Color.BLUEVIOLET, new CornerRadii(1), null)));
//min.setPrefSize(32.0,32.0);
min.setAlignment(Pos.CENTER);
min.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
primaryStage.setIconified(true);
}
});
ResponsiveButton max = new ResponsiveButton("Maximise");
max.setBorder(Border.EMPTY);
max.setBackground(new Background(new BackgroundFill(Color.BLUEVIOLET, new CornerRadii(1), null)));
//max.setPrefSize(32.0,32.0);
max.noDefaultFill = true;
max.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
if(primaryStage.isMaximized()){
primaryStage.setMaximized(false);
}else{
primaryStage.setMaximized(true);
}
}
});
ResponsiveButton logout = new ResponsiveButton("Close me");
logout.noDefaultFill = true;
logout.setBorder(Border.EMPTY);
logout.setBackground(new Background(new BackgroundFill(Color.BLUEVIOLET, new CornerRadii(1), null)));
//logout.setPrefSize(32.0,32.0);
logout.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
primaryStage.close();
}
});
Label label = new Label();
label.setText("Custom Stage");
label.setTextFill(Color.WHITESMOKE);
//label.setAlignment(Pos.CENTER);
label.setPadding(new Insets(0.0,0.0,0.0,18.0));
label.setFont(Font.font("Tahoma", FontWeight.BOLD, 25));
HBox.setHgrow(label, Priority.ALWAYS);
hbox.setAlignment(Pos.CENTER);
hbox.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if(!primaryStage.isMaximized()){
dragX = primaryStage.getX() - mouseEvent.getScreenX();
dragY = primaryStage.getY() - mouseEvent.getScreenY();
hbox.setCursor(Cursor.MOVE);
}
}
});
hbox.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if(!primaryStage.isMaximized()){
hbox.setCursor(Cursor.HAND);
BackgroundFill bf = new BackgroundFill(Color.BLUEVIOLET, new CornerRadii(1), null);
hbox.setBackground(new Background(bf));
}
}
});
hbox.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if(!primaryStage.isMaximized()){
primaryStage.setX(mouseEvent.getScreenX() + dragX);
primaryStage.setY(mouseEvent.getScreenY() + dragY);
BackgroundFill bf = new BackgroundFill(Color.BLANCHEDALMOND, new CornerRadii(1), null);
hbox.setBackground(new Background(bf));
}
}
});
hbox.setOnMouseEntered(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if(!primaryStage.isMaximized()){
if (!mouseEvent.isPrimaryButtonDown()) {
hbox.setCursor(Cursor.HAND);
}
}
}
});
hbox.setOnMouseExited(new EventHandler<MouseEvent>() {
@Override public void handle(MouseEvent mouseEvent) {
if (!mouseEvent.isPrimaryButtonDown()) {
hbox.setCursor(Cursor.DEFAULT);
}
}
});
HBox hbox2 = new HBox(10.0);
HBox.setHgrow(hbox2, Priority.ALWAYS);
hbox2.getChildren().addAll(min,max,logout);
hbox.getChildren().addAll(label,hbox2);
hbox2.setAlignment(Pos.CENTER_RIGHT);
AnchorPane.setTopAnchor(hbox, 0.0);AnchorPane.setLeftAnchor(hbox, 5.0);AnchorPane.setRightAnchor(hbox, 0.0);
AnchorPane.setBottomAnchor(ap , 0.0);AnchorPane.setTopAnchor(ap , 40.0);
AnchorPane.setLeftAnchor(ap , 5.0); AnchorPane.setRightAnchor(ap , 0.0);
ap .setPrefSize(500, 560);
AnchorPane main = new AnchorPane();
main.getChildren().addAll(hbox,ap);
Scene sc = new Scene(main,500,500);
sc.setRoot(main);
Pane p = new Pane();
AnchorPane.setTopAnchor(p, 80.0);
AnchorPane.setLeftAnchor(p, 60.0);
Group root = new Group();
p.setPrefSize(400, 400);
p.setBackground(new Background(new BackgroundFill(Color.GOLD,
null, null)));
root.getChildren().add(p);
ap.getChildren().add(p);
primaryStage.setScene(sc);
primaryStage.setTitle("Custom window");
primaryStage.show();
BubbledLabel bl1 = new BubbledLabel(BubbleSpec.FACE_LEFT_CENTER);
bl1.relocate(10, 50);
bl1.setText("I love this new Custom stage");
bl1.setBackground(new Background(new BackgroundFill(Color.VIOLET,
null, null)));
BubbledLabel bl2 = new BubbledLabel(BubbleSpec.FACE_RIGHT_CENTER);
bl2.relocate(310, 100);
bl2.setText("We all love it");
bl2.setBackground(new Background(new BackgroundFill(Color.LIGHTPINK,
null, null)));
BubbledLabel bl3 = new BubbledLabel(BubbleSpec.FACE_LEFT_CENTER);
bl3.relocate(10, 150);
bl3.setText("Nikitoslav is going love it");
bl3.setBackground(new Background(new BackgroundFill(Color.YELLOWGREEN,
null, null)));
BubbledLabel bl4 = new BubbledLabel(BubbleSpec.FACE_RIGHT_CENTER);
bl4.relocate(165, 200);
bl4.setText("hmmm.. you have you asked him???");
bl4.setBackground(new Background(new BackgroundFill(Color.GREENYELLOW,
null, null)));
BubbledLabel bl5 = new BubbledLabel(BubbleSpec.FACE_LEFT_CENTER);
bl5.relocate(10, 250);
bl5.setText("yea! yea! ");
bl5.setBackground(new Background(new BackgroundFill(Color.YELLOWGREEN,
null, null)));
BubbledLabel bl6 = new BubbledLabel(BubbleSpec.FACE_RIGHT_CENTER);
bl6.relocate(250, 300);
bl6.setText("Oh really!!? oh stop it!!");
bl6.setBackground(new Background(new BackgroundFill(Color.GREENYELLOW,
null, null)));
p.getChildren().addAll(bl1,bl2,bl3,bl4,bl5,bl6);
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
If you just copy the codes here, change ResponsiveButton
to Button and remove the Anchorpane
ap` and its children, its classes are not added, but if you download the package project there is no problem.
回答2:
Is this link a possible solution for what you require? How to bind stage resizing with resizing of components?
it is also possible that this link could work for you as well:
JavaFX: autoresize stage after adding child to root parent
The main line of code from the second link is
stage.sizeToScene();
回答3:
I make resizable borders with mouse cursor position listener, it's work, I have not much time for optimized code:
public class Resize {
double eY = 0;
double eX = 0;
double eStrtY = 0;
double eStrtX = 0;
double sceneStrtY = 0;
double sceneStrtX = 0;
double minW = 600;
double minH = 600;
double w = 0;
public Resize(Stage stage, double w) {
Scene scene = stage.getScene();
AnchorPane root = (AnchorPane)scene.getRoot();
this.w = w;
root.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
eStrtY = e.getSceneY();
eStrtX = e.getSceneX();
sceneStrtY = e.getSceneY();
sceneStrtX = e.getSceneX();
}
});
root.setOnMouseMoved(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
// double w = 8;
double X = event.getSceneX();
double Y = event.getSceneY();
double sW = scene.getWidth();
double sH = scene.getHeight();
if(((X<w)&&(Y<w))||((X<2*w)&&(Y<w))||((Y<2*w)&&(X<w))) {
scene.setCursor(Cursor.NW_RESIZE);
eY = stage.getY();
eX = stage.getX();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if(((eStrtX<w)&&(eStrtY<w))||((eStrtX<2*w)&&(eStrtY<w))||((eStrtY<2*w)&&(eStrtX<w))) {
if(stage.getHeight()+(eY-e.getScreenY())>minH) {
stage.setY(e.getScreenY());
stage.setHeight(stage.getHeight()+(eY-e.getScreenY()));
eY = e.getScreenY();
}
if(stage.getWidth()+(eX-e.getScreenX())>minW) {
stage.setX(e.getScreenX());
stage.setWidth(stage.getWidth()+(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
}
});
}
else
if(((X>sW-w)&&(Y<w))||((X>sW-2*w)&&(Y<w))||((X>sW-w)&&(Y<2*w))) {
scene.setCursor(Cursor.NE_RESIZE);
eY = stage.getY();
eX = stage.getX() + stage.getWidth();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if(((eStrtX>sW-w)&&(eStrtY<w))||((eStrtX>sW-2*w)&&(eStrtY<w))||((eStrtX>sW-w)&&(eStrtY<2*w))) {
if(stage.getHeight()+(eY-e.getScreenY())>minH) {
stage.setY(e.getScreenY());
stage.setHeight(stage.getHeight()+(eY-e.getScreenY()));
eY = e.getScreenY();
}
if(stage.getWidth()-(eX-e.getScreenX())>minW) {
stage.setWidth(stage.getWidth()-(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
}
});
}
else
if(((X>sW-w)&&(Y>sH-w))||((X>sW-2*w)&&(Y>sH-w))||((X>sW-w)&&(Y>sH-2*w))) {
scene.setCursor(Cursor.SE_RESIZE);
eY = stage.getY() + stage.getHeight();
eX = stage.getX() + stage.getWidth();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if(((eStrtX>sW-w)&&(eStrtY>sH-w))||((eStrtX>sW-2*w)&&(eStrtY>sH-w))||((eStrtX>sW-w)&&(eStrtY>sH-2*w))) {
if(stage.getHeight()-(eY-e.getScreenY())>minH) {
stage.setHeight(stage.getHeight()-(eY-e.getScreenY()));
eY = e.getScreenY();
}
if(stage.getWidth()-(eX-e.getScreenX())>minW) {
stage.setWidth(stage.getWidth()-(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
}
});
}
else
if(((X<w)&&(Y>sH-w))||((X<2*w)&&(Y>sH-w))||((X<w)&&(Y>sH-2*w))) {
scene.setCursor(Cursor.SW_RESIZE);
eY = stage.getY() + stage.getHeight();
eX = stage.getX();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if(((eStrtX<w)&&(eStrtY>sH-w))||((eStrtX<2*w)&&(eStrtY>sH-w))||((eStrtX<w)&&(eStrtY>sH-2*w))) {
if(stage.getHeight()-(eY-e.getScreenY())>minH) {
stage.setHeight(stage.getHeight()-(eY-e.getScreenY()));
eY = e.getScreenY();
}
if(stage.getWidth()+(eX-e.getScreenX())>minW) {
stage.setX(e.getScreenX());
stage.setWidth(stage.getWidth()+(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
}
});
}
else
if(Y<w) {
scene.setCursor(Cursor.V_RESIZE);
eY = stage.getY();
eX = stage.getX() + stage.getWidth();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if((eStrtY<w)&&(stage.getHeight()+(eY-e.getScreenY())>minH)) {
stage.setY(e.getScreenY());
stage.setHeight(stage.getHeight()+(eY-e.getScreenY()));
eY = e.getScreenY();
}
}
});
}
else
if(Y>sH-w) {
scene.setCursor(Cursor.V_RESIZE);
eY = stage.getY() + stage.getHeight();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if((eStrtY>sH-w)&&(stage.getHeight()-(eY-e.getScreenY())>minH)) {
stage.setHeight(stage.getHeight()-(eY-e.getScreenY()));
eY = e.getScreenY();
}
}
});
}
else
if(X<w) {
scene.setCursor(Cursor.H_RESIZE);
eX = stage.getX();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if((eStrtX<w)&&(stage.getWidth()+(eX-e.getScreenX())>minW)) {
stage.setX(e.getScreenX());
stage.setWidth(stage.getWidth()+(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
});
}
else
if(X>sW-w) {
scene.setCursor(Cursor.H_RESIZE);
eX = stage.getX() + stage.getWidth();
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if((eStrtX>sW-w)&&(stage.getWidth()-(eX-e.getScreenX())>minW)) {
stage.setWidth(stage.getWidth()-(eX-e.getScreenX()));
eX = e.getScreenX();
}
}
});
}
else
if((X>w)&&(X<sW-w)&&(Y>w)&&(Y<25)) {
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
if((eStrtX>w)&&(eStrtX<sW-w-25*3)&&(eStrtY>w)&&(eStrtY<w+25)) {
stage.setX(e.getScreenX()-sceneStrtX);
stage.setY(e.getScreenY()-sceneStrtY);
}
}
});
}
else
scene.setCursor(Cursor.DEFAULT);
}
});
root.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
eY = e.getScreenY();
eX = e.getScreenX();
}
});
}