JavaFX实现对话框
程序员文章站
2022-07-13 23:25:12
...
第一次写博客,听别人说多把学的知识做笔记,以后忘了容易复习,现在来试试。
正在边学边用JavaFX, JavaFX是否自带对话框目前还不清楚,不过我试着自己实现了一下,虽然很丑,但还是可以实现。
public class Main extends Application
{
public static void main(String[] args) throws Exception
{
Application.launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception
{
Pane pane = new Pane();
ButtonPane b = new ButtonPane(pane, "启动", 80, 40);
b.button.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent arg0)
{
}
});
b.setLayoutXY(200, 200);
b.addToPane();
// 背景颜色
pane.setBackground(new Background(new BackgroundFill(Color.rgb(200, 200, 200), null, null)));
// ---------------------------窗口----------------------------
Scene scene = new Scene(pane, 800, 600);
primaryStage.setTitle("JavaFX");
primaryStage.setScene(scene);
primaryStage.show();
// 右上角点击关闭时, 结束子线程
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>()
{
public void handle(WindowEvent event)
{
System.exit(0);
}
});
// 两次ESC退出程序
primaryStage.addEventHandler(KeyEvent.KEY_PRESSED, new EventHandler<KeyEvent>()
{
int count = 0;
@Override
public void handle(KeyEvent event)
{
if (event.getCode() == KeyCode.ESCAPE)
{
++count;
if (count == 2)
{
System.exit(0);
}
}
}
});
primaryStage.setResizable(false);
// -----------------------------------------------------------
}
}
这样的就有一个窗口了,还有一个按钮
接下来要实现的就是点击按钮,弹出一个对话框
b.button.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent arg0)
{
}
});
点击按钮后,会执行handle()方法里面的代码,所以从这里开始
Dialog d = new Dialog(500, 200);
创建一个对话框对象d, 这个对话框宽500,高200
d.setStageInitStyle(StageStyle.DECORATED);
这个是用来设置对话框的样式
d.setBackround("FF9764");
设置对话框的背景颜色
d.setPromptStr("是否关机?", 210, 30);
设置对话框的提示内容和显示的位置
d.addButton("OK", 60, 30, 160, 130, 1);
添加一个宽60,高30的名为"OK"的按钮,位置是160,130。如果点击了按钮,设置按钮值为1
d.addButton("Cancel", 60, 30, 260, 130, 2);
添加一个宽60,高30的名为"Cancel"的按钮,位置是260,130。如果点击了按钮,设置按钮值为2
d.show();
显示标题栏
-----------------------------------------------
运行效果:
修改一下标题样式
d.setStageInitStyle(StageStyle.UTILITY);
或者可以修改为无标题栏的样式
d.setStageInitStyle(StageStyle.TRANSPARENT);
以下是对话框类的代码:
/**
* 对话框
*/
class Dialog
{
public Stage stage;
public Scene scene;
public Pane pane;
public TextPane prompt;
public int buttonValue;
public Dialog(double width, double height)
{
stage = new Stage();
stage.setWidth(width);
stage.setHeight(height);
pane = new Pane();
scene = new Scene(pane, width, height);
stage.setScene(scene);
buttonValue = 0;
}
/**
* 设置窗口样式
*/
public void setStageInitStyle(StageStyle stageStyle)
{
stage.initStyle(stageStyle);
}
/**
* 设置对话框背景颜色
*/
public void setBackround(String hexColorStr)
{
pane.setBackground(new Background(new BackgroundFill(Color.valueOf(hexColorStr), null, null)));
}
/**
* 设置对话框提示内容
*/
public void setPromptStr(String str, int x, int y)
{
prompt = new TextPane(pane, str);
prompt.setFont("Courier New", 16);
prompt.setLayoutXY(x, y);
prompt.addToPane();
}
/**
* 添加按钮
*/
public void addButton(String name, double width, double height, int x, int y, int returnValue)
{
ButtonPane bp = new ButtonPane(pane, name, width, height);
bp.button.setOnAction(new EventHandler<ActionEvent>()
{
@Override
public void handle(ActionEvent arg0)
{
buttonValue = returnValue;
stage.close();
}
});
bp.setLayoutXY(x, y);
bp.addToPane();
}
/**
* 显示
*/
public void show()
{
stage.show();
}
/**
* 获取按钮值
*/
public int getButtonValue()
{
return buttonValue;
}
}
其实写的垃圾,仅仅只是实现了一下,有了这么个效果而已,完全不能使用...反正是第一次写博客,就当体验一下,也希望以后能继续坚持,以上。
上一篇: 【 LeetCode 5】 最长回文子串 (中等) 动态规划
下一篇: Vue简单新增对话框