我们在课堂上做了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表达式。)