我想创建一个图形阅读器程序,它可以轻松获取任何扫描的图形并将其值转换为 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/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
当我在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)(人们推荐的最少
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在使用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.
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试使用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
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我目前正在使用以下方法获取页面的源代码: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