代码之家  ›  专栏  ›  技术社区  ›  MoratGurgeh

如何将命令模式与JavaFX GUI相结合?

  •  0
  • MoratGurgeh  · 技术社区  · 7 年前

    我当前的控制器类

    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个带有自己的actionevent监听器的函数,我不希望所有这些函数都存在于这个控制器类中。

    1 回复  |  直到 7 年前
        1
  •  1
  •   mr mcwolf    7 年前

    不清楚您希望在什么上下文中使用该模式,因此我展示了一个示例转换,该转换接受窗口的地址(即,将其作为所显示对话框的所有者提交)。

    它从一个描述命令的界面开始(在本例中,我选择返回 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;
        }
    }
    

    从现在开始,我们可以通过实现 命令 或者通过扩展 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,并且不想创建 命令 继承 Controller .