我们在课堂上做了JavaFX实践问题,当我单击“命中”按钮时,它一直给我一个色轮。我看过代码,甚至让我的教授看过代码,但看不到任何问题。这可能是Mac问题吗?我朋友的代码在Windows计算机上运行得很好。

package csc502_classexample_events_1;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javax.swing.JOptionPane;

/**
*
* @author aufty
*/
public class CSC502_ClassExample_Events_1 extends Application
{

@Override
public void start(Stage stage)
{
    // Single centered button in HBox
    Button button = new Button("Hit me");
    button.setOnAction(new ClickHandler());
    HBox hBox = new HBox();
    hBox.getChildren().add(button);
    hBox.setAlignment(Pos.CENTER);

    stage.setTitle("My Event Handler Example");
    Scene scene = new Scene(hBox, 400, 80);
    stage.setScene(scene);
    stage.show();
}

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


}

class ClickHandler implements EventHandler<ActionEvent>
{

@Override
public void handle(ActionEvent event)
{
    JOptionPane.showMessageDialog(null, "Ouch");
}

}

最佳答案

您正在尝试从FX应用程序线程中显示JOptionPane。 Swing UI操作应在AWT事件处理线程上执行。在此示例中,这特别糟糕,因为AWT工具箱(可能)甚至还没有初始化。

就像是

class ClickHandler implements EventHandler<ActionEvent> {

    @Override
    public void handle(ActionEvent event) {
        SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(null, "Ouch"));
    }

}


应该修复它。

(这是Java 8代码,如果您仍在使用旧的Java版本,则可以对Runnable使用匿名内部类而不是lambda表达式。)

09-09 22:58