javafx11 最佳实践_JavaFX移动应用程序最佳实践,第1部分

javafx11 最佳实践

到现在为止,所有对JavaFX感兴趣的人都会知道,JavaFX Mobile发行了不久
前。 可以肯定的是,这真是令人难以置信。 我感到非常筋疲力尽,在发行期间我什至没有精力去写博客……

但是到目前为止,我感到很恢复,并且想开始一些有关在准备发行版时所学到的经验的系列文章,并给出一些如何提高JavaFX Mobile应用程序性能的提示。

警告 :我在这里给出的技巧对于JavaFX Mobile的当前版本是正确的,该版本是JavaFX 1.1 SDK的一部分。 在以后的版本中,行为会改变,
当前提到的伪像的不良性能将被优化或至少得到显着改善。 我在这里写的所有内容都是快照,不应理解为
最后!

项目1:避免不必要的绑定
绑定非常方便,毫无疑问是JavaFX Script中最有价值的创新之一。 不幸的是,它们带有代价。 生成的样板代码通常不那么小,并且
就像手动执行一样快。 尤其是复杂的依存结构往往会严重影响性能和占用空间。

因此,建议尽可能避免绑定。 通常,可以使用触发器来实现相同的功能。 人们不应该使用绑定来避免处理初始化顺序的麻烦。 并且绑定到恒定值当然没有任何意义。
如果绑定变量的更新次数更多,然后读取,则大多数时候(但并非总是如此!),懒惰绑定会更快(但并非总是如此),但它们仍不如手动实现的快。


一个常见的用例是许多节点,这些节点的位置和大小取决于舞台的大小。 一个典型的实现使用绑定来实现这一点。
在这里,我们将看一个类似于这种情况的简单示例。 场景由三个矩形组成,这些矩形从左上角到右下角倾斜排列。 矩形的大小是屏幕大小的四分之一。 代码示例1显示了具有绑定的实现。

def rectangleWidth: Number = bind stage.width * 0.25;
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一份使用JavaFX和GUI知识写的Java数字华容道小程序,它可以创建一个窗口,在窗口中显示一个数字华容道游戏面板,并且支持用户通过鼠标点击来移动数字块。 ``` import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.scene.text.Font; import javafx.scene.text.Text; import javafx.stage.Stage; import java.util.ArrayList; import java.util.Collections; public class DigitalPuzzle extends Application { private static final int PUZZLE_SIZE = 3; // 数字华容道的尺寸 private static final int CELL_SIZE = 100; // 每个格子的大小 private static final int BOARD_SIZE = PUZZLE_SIZE * CELL_SIZE; // 棋盘的大小 private Rectangle[][] cells = new Rectangle[PUZZLE_SIZE][PUZZLE_SIZE]; // 棋盘上的格子 private Text[][] texts = new Text[PUZZLE_SIZE][PUZZLE_SIZE]; // 每个格子上的数字 private Button shuffleButton = new Button("Shuffle"); // 用于洗牌的按钮 private ArrayList<Integer> numbers = new ArrayList<>(); // 数字华容道中的数字 @Override public void start(Stage primaryStage) { // 初始化数字 for (int i = 0; i < PUZZLE_SIZE * PUZZLE_SIZE - 1; i++) { numbers.add(i + 1); } // 创建棋盘 GridPane board = new GridPane(); board.setPrefSize(BOARD_SIZE, BOARD_SIZE); // 创建每个格子并添加到棋盘上 for (int i = 0; i < PUZZLE_SIZE; i++) { for (int j = 0; j < PUZZLE_SIZE; j++) { Rectangle cell = new Rectangle(CELL_SIZE, CELL_SIZE); cell.setFill(Color.WHITE); cell.setStroke(Color.BLACK); cells[i][j] = cell; Text text = new Text(); text.setFont(Font.font("Arial", 40)); text.setFill(Color.BLACK); texts[i][j] = text; StackPane pane = new StackPane(); pane.getChildren().addAll(cell, text); board.add(pane, j, i); } } // 在棋盘上随机放置数字 shuffleNumbers(); // 添加事件响应 board.addEventHandler(MouseEvent.MOUSE_CLICKED, e -> { // 获取点击的格子 int row = (int) e.getY() / CELL_SIZE; int col = (int) e.getX() / CELL_SIZE; // 移动数字 moveNumber(row, col); // 检查是否完成游戏 if (isGameFinished()) { System.out.println("You win!"); } }); // 创建洗牌按钮并添加事件响应 shuffleButton.setOnAction(e -> shuffleNumbers()); // 创建布局 StackPane root = new StackPane(); root.getChildren().addAll(board, shuffleButton); // 创建场景并显示 Scene scene = new Scene(root, BOARD_SIZE + 100, BOARD_SIZE); primaryStage.setTitle("Digital Puzzle"); primaryStage.setScene(scene); primaryStage.show(); } /** * 重新随机放置数字 */ private void shuffleNumbers() { Collections.shuffle(numbers); // 将数字放置到相应的格子上 int index = 0; for (int i = 0; i < PUZZLE_SIZE; i++) { for (int j = 0; j < PUZZLE_SIZE; j++) { if (index < PUZZLE_SIZE * PUZZLE_SIZE - 1) { texts[i][j].setText(String.valueOf(numbers.get(index))); } else { texts[i][j].setText(""); } index++; } } } /** * 移动数字 * * @param row 行号 * @param col 列号 */ private void moveNumber(int row, int col) { // 检查是否有空格相邻 if (row > 0 && texts[row - 1][col].getText().isEmpty()) { swap(row, col, row - 1, col); } else if (row < PUZZLE_SIZE - 1 && texts[row + 1][col].getText().isEmpty()) { swap(row, col, row + 1, col); } else if (col > 0 && texts[row][col - 1].getText().isEmpty()) { swap(row, col, row, col - 1); } else if (col < PUZZLE_SIZE - 1 && texts[row][col + 1].getText().isEmpty()) { swap(row, col, row, col + 1); } } /** * 交换两个格子的数字 * * @param row1 第一个格子的行号 * @param col1 第一个格子的列号 * @param row2 第二个格子的行号 * @param col2 第二个格子的列号 */ private void swap(int row1, int col1, int row2, int col2) { String temp = texts[row1][col1].getText(); texts[row1][col1].setText(texts[row2][col2].getText()); texts[row2][col2].setText(temp); } /** * 检查游戏是否完成 * * @return 如果游戏完成,则返回true;否则返回false */ private boolean isGameFinished() { int index = 1; for (int i = 0; i < PUZZLE_SIZE; i++) { for (int j = 0; j < PUZZLE_SIZE; j++) { if (!texts[i][j].getText().equals(String.valueOf(index))) { return false; } index++; if (index == PUZZLE_SIZE * PUZZLE_SIZE) { // 最后一个格子为空 return texts[i][j].getText().isEmpty(); } } } return true; } public static void main(String[] args) { launch(args); } } ``` 这段代码中,我们使用了JavaFX的布局和控件来创建窗口和按钮,使用GridPane来创建数字华容道的棋盘。我们也添加了鼠标事件来响应用户的移动操作,并且检查是否完成游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值