桌面盯盘软件开发(javaFx设置窗口隐藏,透明度,可拖动,表格控件数据轮询更新,窗体右键菜单)

wylc123 3月前 ⋅ 200 阅读

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)判断


相关文章推荐

全部评论: 0

    我有话说: