【问题标题】:RotateTransition causing GUI to freeze in javaFX [closed]RotateTransition导致GUI在javaFX中冻结[关闭]
【发布时间】:2021-04-15 09:14:16
【问题描述】:

一般来说,在修复错误时,我不倾向于寻求帮助,但是,我有一个非常奇怪的问题,我花了 2 天时间试图修复它,但没有任何成功。我的课基本上是一个有多个难度的轮盘赌,所以我使用了一个饼图来改变难度并快速重绘轮盘,并使用饼图附带的很酷的动画,但是,让我的轮盘滚动到某个角度的方法有很大问题,在 RotateTransition 结束后,GUI 完全冻结。我不知道为什么,因为我在其他类中有其他 RotateTranstions,它们工作正常,而且,如果我删除 rotateTransition 或在其中使用其他组件(我尝试使用 pieChart 的图像)它工作得很好。我不知道 pieChart 是否有一些特殊之处使其无法与 RotateTransition 一起使用,唯一的冻结例外是允许我再次下注的按钮,是的,我已经尝试过“Platform.runLatter()”

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        rotateTransition = new RotateTransition();
        rotateTransition.setNode(pieChart);
        rotateTransition.setDuration(Duration.seconds(1));
        rotateTransition.setByAngle(-360);
        rotateTransition.setCycleCount(1);
        rotateTransition.setAutoReverse(false);

        pieChart.setData(dataForX1_5);
        pieChart.setStartAngle(90);
        applyDataWithCustomColor(dataForX1_5, "green", "red");
        
        betButton.setOnAction(eh -> {
            double betMultiplier=1.5;
            if(rbX1_5==group.getSelectedToggle()){
                pieChart.setData(dataForX1_5);
                applyDataWithCustomColor(dataForX1_5, "green", "red");
                betMultiplier=1.5;
            }
            if(rbX2==group.getSelectedToggle()){
                pieChart.setData(dataForX2);
                applyDataWithCustomColor(dataForX2, "green", "red");
                betMultiplier=2;
            }
            if(rbX5==group.getSelectedToggle()){
                pieChart.setData(dataForX5);
                applyDataWithCustomColor(dataForX5, "green", "red");
                betMultiplier=5;
            }
            if(rbX10==group.getSelectedToggle()){
                pieChart.setData(dataForX10);
                applyDataWithCustomColor(dataForX10, "green", "red");
                betMultiplier=10;
            }
            if(rbX25==group.getSelectedToggle()){
                pieChart.setData(dataForX25);
                applyDataWithCustomColor(dataForX25, "green", "red");
                betMultiplier=25;
            }
            if(rbX50==group.getSelectedToggle()){
                pieChart.setData(dataForX50);
                applyDataWithCustomColor(dataForX50, "green", "red");
                betMultiplier=50;
            }
            
            try {
                int betAmount = betAmountSpinner.getValue();
                int spectedResult = (int) (betAmount * betMultiplier);
                if (coins >= betAmount) {
                    dataOutputStream.writeUTF("PlaceBetOnUpgrade");
                    dataOutputStream.writeInt(betAmount);
                    dataOutputStream.writeInt(spectedResult);
                    if (dataInputStream.readBoolean()) {
                        int result = dataInputStream.readInt();
                        int payment = dataInputStream.readInt();
                        coins = coins - betAmount;
                        rotateTo(result, payment);
                        updateCoinsLabel();
                    }
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });
    }

    private void rotateTo(int result, int payment) {
        rotateTransition.setToAngle(result * 3.60);
        rotateTransition.setOnFinished(rotateEvent -> {
            if (0 == payment) {
                resultLabel.setText("Lost");
            } else {
                resultLabel.setText("Win");
                coins = coins + payment;
                updateCoinsLabel();
            }
        });
        rotateTransition.play();
    }

    private void updateCoinsLabel() {
        coinsLabel.setText(String.valueOf(coins));
    }

【问题讨论】:

  • 重现问题所必需的所有代码吗?你能把它浓缩成minimal reproducible example吗?
  • 请阅读参考的帮助页面并采取相应措施
  • 你真的希望 me(或任何其他潜在的帮助者)猜测完整控制器、fxml、应用程序和找到 your 代码中某处的错误(可能在我们猜测的代码中,也可能不在我们猜测的代码中)?这不会发生(不是来自我,也可能不是来自其他人)。顺便说一句:你知道像 100% 确定问题出在方法 这样的注释是逻辑废话,不是吗?仅当您确切地知道问题出在哪里时才是正确的,在这种情况下,询问是......没有实际意义;)
  • 请在reproducible 发布一些内容,同时努力使示例最小化。
  • 当您使代码更加集中时,您正朝着正确的方向前进。问题是您的示例(实际上是编辑前和编辑后)永远无法正确重现,因为我们不能只是复制它并执行它。问题出在你想的地方吗?是的。但这仅意味着您事后看来是正确的。当您在这里提出问题时,示例应该就像您正在提交错误报告一样。换句话说,它应该是minimal reproducible example。链接的帮助页面解释了它应该是什么样子。让我们更轻松地为您提供帮助只会为您带来好处。

标签: java user-interface animation javafx concurrency


【解决方案1】:

好吧,我最终找到了解决问题的方法,而这正是我所说的我应该去的地方。问题是,即使您可以在技术上使用 RotateTransition 旋转饼图,您也必须注意,这样做时,您不仅会旋转您在屏幕上看到的饼图,还会旋转它后面的透明层,甚至当禁用标签和图例时,将占据最大可能尺寸的矩形形式。因此,当您旋转饼图时,透明层将覆盖所有组件,导致冻结,无一例外。大多数人推荐的解决方案是将其设置为鼠标透明并允许点击穿透,但它不起作用,因为它被窃听并且只允许在饼图中而不是在透明层中的点击穿透,所以如果你想要旋转饼图,您需要它位于屏幕的中心,因此即使它旋转到 90º 角,它也只会与屏幕外的东西重叠,所以没关系。如果您需要将其放置在其他位置,则需要将其最大尺寸设置为与 Max_size 不同的值,并检查它是否永远不会重叠,但是,它肯定会限制您在高分辨率下的视图质量。

【讨论】:

  • 您最好使用各种Arc 节点创建自己的控件。假设你真的不需要PieChart 的所有功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2021-11-09
  • 2017-12-03
  • 2023-04-07
  • 2017-03-09
  • 2018-05-25
相关资源
最近更新 更多