当前位置: 首页 > 知识库问答 >
问题:

gridpane上的JavaFX交换按钮

越俊艾
2023-03-14

我正在用JavaFX编写一个益智游戏。

您可以在单击网格后与另一个按钮进行按钮交换吗?

前任。我想在按下按钮1后交换按钮1和9。我认为应该有可能改变网格窗格的位置。

当我点击按钮4时,它与按钮9互换。

有没有办法做到这一点?

这是我的代码:

import javafx.application.Application;

import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;

import javafx.scene.Parent;

import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import javafx.scene.image.ImageView;


import javafx.scene.image.Image;

import javafx.embed.swing.SwingFXUtils;
import javafx.scene.layout.GridPane;

import javafx.geometry.Insets;



public class Main extends Application {

    static Scene scene1;

    @Override
    public void start(Stage primaryStage) throws Exception{

        primaryStage.setTitle("Puzzles");
        Label label1= new Label("Let's play a game");
        Button button1= new Button("Go back to the menu");
        Parent root = FXMLLoader.load(getClass().getResource("First.fxml"));
        Scene scene = new Scene(root);
        button1.setOnAction(e -> primaryStage.setScene(scene));



        GridPane gridPane = new GridPane();

        gridPane.setMinSize(800, 600);

        gridPane.setPadding(new Insets(10, 10, 10, 10));




        BufferedImage originalImgage = ImageIO.read(new File("C:\\Users\\PC\\Desktop\\mateusz\\Project2\\src\\pic.jpg"));
        BufferedImage blank = ImageIO.read(new File("C:\\Users\\PC\\Desktop\\mateusz\\Project2\\src\\bialt.png"));


        BufferedImage one = originalImgage.getSubimage(0, 0, 100, 100);
        BufferedImage two = originalImgage.getSubimage(100, 0, 100, 100);


        Image q1 = SwingFXUtils.toFXImage(one, null );
        Image q2 = SwingFXUtils.toFXImage(two, null );

        Image q9 = SwingFXUtils.toFXImage(blank, null );

        ImageView i1 = new ImageView(q1);
        ImageView i2 = new ImageView(q2);

        ImageView i9 = new ImageView(q9);


        Button b1 = new Button("",i1);
        Button b2 = new Button("",i2);

        Button b9 = new Button("",i9);


        gridPane.add(label1, 0, 0);
        gridPane.add(button1, 1, 0);
        gridPane.add(b1, 0, 1);
        gridPane.add(b2, 1, 1);
        gridPane.add(b9, 2, 3);



        scene1= new Scene(gridPane, 800, 600);


        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

共有1个答案

马庆
2023-03-14

您可以通过计算两个节点的行/列索引来交换 GridPane 的 2 个子级的“单元格”:

public static void swap(Node n1, Node n2) {
    Integer temp = GridPane.getRowIndex(n1);
    GridPane.setRowIndex(n1, GridPane.getRowIndex(n2));
    GridPane.setRowIndex(n2, temp);

    temp = GridPane.getColumnIndex(n1);
    GridPane.setColumnIndex(n1, GridPane.getColumnIndex(n2));
    GridPane.setColumnIndex(n2, temp);
}

用法:

swap(b1, b9); // change places of b1 and b9
 类似资料:
  • 主要内容:示例,示例2GridPane通常用于布局:第一列上的只读标签的输入表单和第二列上的输入字段。 GridPane可以在行,列或单元格级别指定约束。 例如,我们可以设置包含输入文本字段的第二列,以在窗口调整大小时调整大小。 示例 以下代码演示使用GridPane布局的简单表单应用程序。它有以下布局。 完整的代码实现如下所示 - 上面的代码生成以下结果。 示例2 以下是一个实现登录窗口的代码 - 上面的代码生成以下

  • 嗨,我目前正在玩JavaFX中的GridPane,偶然发现了一个问题...我想创建一个包含三行的布局,其中中间一行增长并占用所有可用空间,但我就是无法让它工作。中间行变得太大,并将窗口下方的底部行“推”到不再可见的位置...我如何使底部行始终在底部,让中间行占用中间的可用空间,但不能再这样了...我将在下面粘贴我的代码。 谢啦! (注意:为清晰起见,代码略有改动,但工作方式相同) 更新!添加“最小

  • 问题:我混淆了vbox和gridpane。。通常,当您可以使用vbox时,您也可以使用包含1列和n行的gridPane,因此我不确定何时使用每一列和它们之间的差异。 事实: > 我知道网格窗格有n行和n列。 我知道vbox只会垂直列出组件。(n行1列) 困惑:当我想垂直列出40-50个(水平框或其他组件)时,我不知道应该选择哪一个,因为有时我会看到人们将这些组件作为子组件添加到vbox中,而其他人

  • 我正在使用JavaFX开发一款扫雷游戏: 我的是由组成的,我试图找到一种方法来计算在上单击的图像的列和行索引。我目前有这个代码: 但是,方法和返回。我做错了什么?

  • 主要内容:创建切换按钮,切换按钮组,ToggleButton行为,样式切换按钮切换按钮具有两种状态:选择或未选择。 我们通常将两个或多个切换按钮组合成一个组,并允许用户只选择一个按钮或不选择。 创建切换按钮 我们可以使用类的三个构造函数创建一个切换按钮。要创建没有任何字幕或图标的切换按钮。 要创建带有文字说明的切换按钮 要创建带有文字说明和图标的切换按钮。 方法可以将文本设置为,以及方法可以将图像安装到。 切换按钮组 切换组不强制选择至少一个按钮。单击所选的切换按钮可取消选

  • 我正在制作一个基于虫子“感知”和吃食物的网格风格游戏/模拟。我正在使用标签的gridPane(称为)来显示虫子和食物的网格。当虫子将细胞移向食物等时,这显然会不断更新。 我目前有一个函数,我想用在cell Content中具有新文本的标签替换[row, ol]处的标签。 我有一个有效的方法 然而,我担心这仅仅是在当前标签上添加了一个标签,显然超过100次的模拟迭代并不理想。 在添加标签之前,我已经