如何将命令模式与JavaFX GUI结合使用?
我现在控制器类如何将命令模式与JavaFX GUI结合使用?
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功能逻辑在其自己的类?我需要为自己的UI添加大约10-20个函数,并且我不希望在这个控制器类中存在所有这些函数。
回答:
目前尚不清楚您想使用该模式的上下文,所以我展示了一个接受窗口地址的示例转换(即,将其作为所显示的对话框的所有者提交)。
它首先描述命令(在这种情况下,我选择了回到Optional
)
public interface Command<R> { public Optional<R> execute();
}
的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
。
以上是 如何将命令模式与JavaFX GUI结合使用? 的全部内容, 来源链接: utcz.com/qa/258565.html