如何将命令模式与 JavaFX GUI 相结合?
How do I combine the Command Pattern with a JavaFX GUI?
我现在的控制器class
public class Controller {
@FXML
public javafx.scene.image.ImageView imageView;
@FXML
private MenuItem openItem;
@FXML
public void openAction(ActionEvent event) {
FileChooser fc = new FileChooser();
File file = fc.showOpenDialog(null);
try {
BufferedImage bufferedImage = ImageIO.read(file);
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
imageView.setImage(image);
} catch (IOException e) {
System.out.println("lol");
}
}
我怎样才能将 openAction 函数逻辑放在它自己的 class 中?我需要为我的 UI 添加大约 10 - 20 个带有它们自己的 actionevent 侦听器的函数,我不想让所有这些函数都存在于这个控制器中 class.
不清楚你想在什么上下文中使用该模式,所以我展示了一个示例转换,它接受 window 的地址(也就是说,将其作为对话框的所有者提交显示)。
它以描述命令的界面开始(在这种情况下我选择 return Optional
)
public interface Command<R> {
public Optional<R> execute();
}
抽象 class 中 Command
接口的实现如下。
public abstract class AbstractCommand<R> implements Command<R> {
private Window window;
public AbstractCommand(Window window) {
this.window = window;
}
public Window getWindow() {
return window;
}
}
从现在开始,我们可以通过实现 Command
或扩展 AbstractCommand
.
来实现我们想要的实现。
这是加载图像命令的示例实现
public class LoadImageCommand extends AbstractCommand<Image> {
public LoadImageCommand() {
this(null);
}
public LoadImageCommand(Window window) {
super(window);
}
@Override
public Optional<Image> execute() {
Image image = null;
FileChooser fc = new FileChooser();
File file = fc.showOpenDialog(getWindow());
try {
if(file != null) {
BufferedImage bufferedImage = ImageIO.read(file);
image = SwingFXUtils.toFXImage(bufferedImage, null);
}
} catch (IOException e) {
System.out.println("lol");
}
return Optional.ofNullable(image);
}
}
使用命令:
@FXML
private void openAction(ActionEvent event) {
new LoadImageCommand().execute().ifPresent(imageView::setImage);
}
如果您想在不同的控制器中使用 openAction 并且不想创建单独的 Command
实例,请继承 Controller
.
我现在的控制器class
public class Controller {
@FXML
public javafx.scene.image.ImageView imageView;
@FXML
private MenuItem openItem;
@FXML
public void openAction(ActionEvent event) {
FileChooser fc = new FileChooser();
File file = fc.showOpenDialog(null);
try {
BufferedImage bufferedImage = ImageIO.read(file);
Image image = SwingFXUtils.toFXImage(bufferedImage, null);
imageView.setImage(image);
} catch (IOException e) {
System.out.println("lol");
}
}
我怎样才能将 openAction 函数逻辑放在它自己的 class 中?我需要为我的 UI 添加大约 10 - 20 个带有它们自己的 actionevent 侦听器的函数,我不想让所有这些函数都存在于这个控制器中 class.
不清楚你想在什么上下文中使用该模式,所以我展示了一个示例转换,它接受 window 的地址(也就是说,将其作为对话框的所有者提交显示)。
它以描述命令的界面开始(在这种情况下我选择 return Optional
)
public interface Command<R> {
public Optional<R> execute();
}
抽象 class 中 Command
接口的实现如下。
public abstract class AbstractCommand<R> implements Command<R> {
private Window window;
public AbstractCommand(Window window) {
this.window = window;
}
public Window getWindow() {
return window;
}
}
从现在开始,我们可以通过实现 Command
或扩展 AbstractCommand
.
这是加载图像命令的示例实现
public class LoadImageCommand extends AbstractCommand<Image> {
public LoadImageCommand() {
this(null);
}
public LoadImageCommand(Window window) {
super(window);
}
@Override
public Optional<Image> execute() {
Image image = null;
FileChooser fc = new FileChooser();
File file = fc.showOpenDialog(getWindow());
try {
if(file != null) {
BufferedImage bufferedImage = ImageIO.read(file);
image = SwingFXUtils.toFXImage(bufferedImage, null);
}
} catch (IOException e) {
System.out.println("lol");
}
return Optional.ofNullable(image);
}
}
使用命令:
@FXML
private void openAction(ActionEvent event) {
new LoadImageCommand().execute().ifPresent(imageView::setImage);
}
如果您想在不同的控制器中使用 openAction 并且不想创建单独的 Command
实例,请继承 Controller
.