jjzjj

java - 维护和控制 GUI 状态和子状态

coder 2024-03-13 原文

我想创建一个图形阅读器程序,它可以轻松获取任何扫描的图形并将其值转换为 CSV。下图描述了基本的控制流程

我已经启动并运行了一个满足我的基本要求的原型(prototype),但在继续开发之前,我想知道维护 GUI 状态和子状态的最佳方法。现在我正在使用枚举:

public enum UIState {
    MAKING_SELECTION, SELECTING_AXIS_POINTS, SETTING_VALUES, SELECTING_GRAPH_POINTS
}

Controller 有一个UIState,可以通过调用按钮和鼠标监听器来设置

public void setUiState(UIState uiState) {
    switch (this.uiState = uiState) {
        case MAKING_SELECTION:
            frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            break;
        case SELECTING_AXIS_POINTS:
            clearSelection();
            frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
            break;
        case SETTING_VALUES:
            clearSelection();
            break;
        case SELECTING_GRAPH_POINTS:
            frame.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
            clearSelection();
            break;
    }

    updateView(); //Repaints frame
    setChanged();
    notifyObservers(uiState);
}

我的 OptionsPanel,包含所有按钮和输入字段的面板,观察 Controller 并在观察到变化时调用一个巨大的开关:

@Override
public void update(Observable o, Object arg) {
    if (arg instanceof UIState) {
        switch ((UIState)arg) {
            case MAKING_SELECTION:
                //Set component statuses
                break;
            case SELECTING_AXIS_POINTS:
                //Set component statuses
                break;
            case SETTING_VALUES:
                //Set component statuses
                break;
            case SELECTING_GRAPH_POINTS:
                //Set component statuses
                break;
        }
    }
}

组件的设置只需在我的每一个按钮和文本字段上调用 ​​setEnabled() 即可完成,这对于少量组件来说已经变得不清楚了。除了 isLeftMouseButton()isRightMouseButton() 查询之外,我的鼠标监听器也有类似的开关,这让整个事情变得非常困惑。

我的实现甚至不包括子状态,尽管我现在已经可以正常工作了,但光标的设置已经不一致了。

所以我的问题是:是否有更好的解决方案来维护这些 GUI 状态和子状态并根据用户输入设置 UI 组件状态,尤其是更容易实现更高一致性的解决方案?

最佳答案

处理这个问题的最好方法是使用状态设计模式:

http://en.wikipedia.org/wiki/State_pattern

您拥有通用输入监听器,可将任务执行委托(delegate)给您的具体状态。然后无论哪个是当前的具体状态,都会以自己独特的方式处理输入。如何应用这个概念有很多变化。但关键思想是,当应用程序状态发生变化时,一个不同的 State 对象将成为“当前状态”并负责处理输入。

例如:在 mouseMove() 事件处理程序中调用 currentState.mouseMove(evt) 并让当前状态对象处理 mouseMove根本不需要 switch 语句。

关于java - 维护和控制 GUI 状态和子状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27516478/

有关java - 维护和控制 GUI 状态和子状态的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

    我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  8. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  9. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  10. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

随机推荐