1. 设置窗口不可见
stage.initStyle(StageStyle.TRANSPARENT);
2. 设置窗体透明度
stage.setOpacity(0.5);
3. 设置表格窗口可拖动
/***************窗体拖拽************************************/
table.setOnMousePressed(event -> {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
});
table.setOnMouseDragged(event -> {
stage.setX(event.getScreenX() - xOffset);
stage.setY(event.getScreenY() - yOffset);
});
/***************窗体拖拽结束************************************/
4. 设置任务栏图标隐藏
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
// 设置风格为 UTILITY
primaryStage.initStyle(StageStyle.UTILITY);
// 设置父级透明度为0
primaryStage.setOpacity(0);
Stage mainStage = new Stage();
// 将 primaryStage 设置为归属对象,即父级窗口
mainStage.initOwner(primaryStage);
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
mainStage.setTitle("Hello World");
mainStage.setScene(new Scene(root, 300, 275));
// 先把 primaryStage 显示,再显示其他内容(顺序必须这样,因为父级必须显示,如果直接显示 mainStage, 则任务栏图标隐藏无效)
primaryStage.show();
mainStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
5. 表格控件数据轮询更新实现
//刷新表格数据
Timer timer=new Timer();
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
PropertiesLoader propertiesLoader = new PropertiesLoader(resourcesPaths);
String stockCodes = propertiesLoader.getProperty("stock.codes");
String stock_url = propertiesLoader.getProperty("stock.url");
if (StringUtil.isNotBlank(stockCodes)){
String[] codeList = stockCodes.split("~");
if(codeList!=null && codeList.length>0){
List<String> scodeList = Arrays.asList(codeList);
//删除
// 找出不在配置文件里的股票,删除掉
if(data!=null && data.size()>0){
for(StockData stockData : data){
String scode = stockData.getCode();
if(!scodeList.contains(scode)){
// 不包含
// table.getItems().remove(stockData.getId());
data.remove(stockData.getId());
}
}
}
for (int i = 0; i < codeList.length; i++) {
String code = codeList[i];
List<String> paramlist = new ArrayList<>();
String paramstr = "";
paramstr = "q=s_" + code;
paramlist.add(paramstr);
paramstr = String.join("&", paramlist);
String json = HttpRequest.sendGet(stock_url,paramstr,null);
String[] jsonArr = json.split("~");
if(jsonArr!=null && jsonArr.length>0){
StockData stockData = new StockData(i, jsonArr[1], code, jsonArr[3], jsonArr[4], jsonArr[5], jsonArr[6], jsonArr[7], jsonArr[9]);
StockData newData = data.stream().filter(n->n.getCode().equals(stockData.getCode())).findAny().orElse(null);
if(newData!=null){
//改
table.getItems().set(i,stockData);
}else {
//增加
//tableView.getItems().add(new Data2("小李",77,55,false));
data.add(stockData);
}
}
}
}
int height = 30*data.size();
stage.setHeight(height);
}
}
};
timer.schedule(timerTask, 0, 1000);
}
6. 实现窗体右键菜单功能
最简单的右键菜单代码:
package zkh.javafx.learn.contextmenu;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.MenuItem;
import javafx.stage.Stage;
/**
* ContextMenu
*/
//继承javafx.application.Application是JavaFX的开始
public class ContextMenu1 extends Application {
/**
* Stage:就是你能看到的整个软件界面(窗口)
* Scene:就是除了窗口最上面有最大、最小化及关闭按钮那一行及窗口边框外其它的区域(场景)
* 场景(Scene)是一个窗口(Stage)必不可少的
*/
@Override
public void start(Stage stage) throws Exception {
final Label label = new Label("一个即将被添加右键菜单的Label"); label.setAlignment(Pos.CENTER);
label.setStyle("-fx-background-color:gray");
// 右键菜单===================================================================
// 创建右键菜单
ContextMenu contextMenu = new ContextMenu();
// 菜单项
MenuItem redBg = new MenuItem("黑底白色");
redBg.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
label.setStyle("-fx-background-color:black;-fx-text-fill:white;");
}
});
// 菜单项
MenuItem blueBg = new MenuItem("白底黑字");
blueBg.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
label.setStyle("-fx-background-color:white;-fx-text-fill:black;");
}
});
contextMenu.getItems().addAll(redBg, blueBg);
// 右键菜单===================================================================
// 添加右键菜单到label
label.setContextMenu(contextMenu);
// 1、初始化一个场景
Scene scene = new Scene(label, 800, 600);
// 2、将场景放入窗口
stage.setScene(scene);
// 3、打开窗口
stage.show();
}
public static void main( String[] args ){
// 启动软件
Application.launch(args);
}
}
7. 窗体置顶显示
stage.setAlwaysOnTop(true);
8. JavaFX窗口状态设置
1. 窗口最大化显示
Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
stage.setX(primaryScreenBounds.getMinX());
stage.setY(primaryScreenBounds.getMinY());
stage.setWidth(primaryScreenBounds.getWidth());
stage.setHeight(primaryScreenBounds.getHeight());
Java8中可以通过以下语句进行设置窗口最大化:
stage.setMaximized(true);
2. 始终显示在其他窗口之上
stage.setAlwaysOnTop(true);
3. 全屏显示,Esc退出
stage.setFullScreen(true);
4. 最小化,任务栏可见图标
stage.setIconified(true);
5. 设置窗口风格
stage.initStyle(StageStyle);
StageStyle有几种类型
1) DECORATED——白色背景,带有最小化/最大化/关闭等有操作系统平台装饰( 默认设置)
2) UNDECORATED——白色背景,没有操作系统平台装饰
3) TRANSPARENT——透明背景,没有操作系统平台装饰
4) UTILITY——白色背景,只有关闭操作系统平台装饰
设置任务栏不显示当前程序的图标
stage.initStyle(StageStyle.UTILITY);
5) UNIFIED——有操作系统平台装饰,消除装饰和内容之间的边框,内容背景和边框背景一致,(但要视平台支持),可以通过javafx.application.Platform.isSupported(javafx.application.ConditionalFeature)判断
注意:本文归作者所有,未经作者允许,不得转载