我认为最难以真正掌握"真实SWING生活"的设计模式之一是MVC模式.我已经浏览了这个讨论模式的网站上的一些帖子,但我仍然觉得我不清楚如何利用我的(Java SWING)应用程序中的模式.
假设我有一个包含表格,几个文本字段和几个按钮的JFrame.我可能会使用TableModel将JTable与基础数据模型"桥接".但是,负责清除字段,验证字段,锁定字段以及按钮操作的所有函数通常都直接在JFrame中.但是,是不是混合了Controller和View的模式?
据我所见,我设法在查看JTable(和模型)时"正确"实现了MVC模式,但是当我整个看整个JFrame时,事情变得混乱.
我真的很想听听别人对此的看法.当你需要向用户显示表格,几个字段和一些按钮(使用MVC模式)时,你如何去做?
我已经为EHCache配置了一个defaultCache(用于元素),一个StandardQueryCache(用于查询)和UpdateTimestampsCache(我认为是为了跟踪数据库更新......但我并没有真正得到它所做的一切).
我为每个缓存设置了maxElementsInMemory,但我没有得到的是这个数字控制StandardQueryCache和UpdateTimestampsCache的内容.我知道可以在默认缓存中缓存的实体数量不得超过10000,但查询缓存不会缓存元素.它缓存主键(据我所知).
这是否意味着StandardQueryCache的maxElementsInMemory控制结果中的"行"数,或者它是否控制了它可能具有的元素的主键对数?
那么UpdateTimestampsCache呢?它是否跟踪实体上次更新的时间,上次更新表的时间......或其他内容?我应该为maxElementsInMemory使用哪个号码?
谢谢!
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true">
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600">
</defaultCache>
<cache
name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600">
</cache>
<cache
name="org.hibernate.cache.spi.UpdateTimestampsCache"
maxElementsInMemory="10000"
eternal="true">
</cache>
</ehcache>
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,我需要与IBM系统进行交互,该系统通过WebSphere MQ与外部世界进行通信.我需要使用队列以"请求 - 响应"方式查询系统,我将通过队列管理器执行此操作.
但是,我无法理解这在实际工作中是如何运作的.
假设我有相同应用程序的多个实例,它们将消息放入请求队列.该消息得到了CorrelationId和MessageId在离开应用程序和ReplyToQueue属性,都会设置每封邮件,以确保该队列管理器知道哪个队列把到响应.
但是,队列管理器如何操作响应队列?关于响应的时间安排无法保证,那么正确的响应如何回到发出相应请求的应用程序实例?
我一直认为消息队列是一个FIFO队列,必须逐个拾取消息.但是,这意味着实例A可以选择针对例如B的响应.显然,这不是它的工作原理.
然后,当我看API( com.ibm.mq.MQQueue)我看到来接的消息我有机会提供CorrelationId和MessageId请求消息的.这是否意味着当我向队列管理器查询消息(具有这些ID的集合)时,队列管理器会遍历队列中的消息并返回匹配的消息?另一方面,这意味着我们不是在谈论FIFO队列?
无法真正找到关于此的任何细节,但是'SET foreign_key_checks = 0'的范围是当前连接,当前会话还是当前事务?
我有一个JTree,用户可以从其他组件中删除元素.当用户将鼠标悬停在树中的节点上时(在"丢弃模式"期间),突出显示最接近的节点.这是在TransferHandler的实现中实现的.
@Override
public boolean canImport(TransferSupport support) {
//Highlight the most near lying node in the tree as the user drags the
//mouse over nodes in the tree.
support.setShowDropLocation(true);
Run Code Online (Sandbox Code Playgroud)
每次选择新节点时(也在"丢弃模式"期间),这将启动TreeSelectionEvent.这反过来将调用我创建的侦听器,该侦听器将查询数据库以获取与该节点相关的详细信息.
现在,我正在寻找一种方法来以某种方式过滤掉"丢弃模式"期间从节点选择中生成的事件.这是一种限制数据库调用的尝试.有没有人对我如何实现这一点有任何想法?
所有输入将非常感谢!
我创建了一个 servlet,它返回一个流(来自 MP3 文件),从客户端请求的任何给定字节位置开始。这允许客户端在任何给定的字节位置立即开始播放,而无需进行任何本地搜索。
现在,我有一个滑块来可视化进度。我正在使用当前字节位置来更新滑块。但是,我还想以秒为单位显示当前位置。
这要求服务器可以将当前以字节为单位的位置“转换”为以毫秒为单位的位置。然后服务器可以只提供以毫秒为单位的流开始位置作为响应头。
有没有人有关于如何计算当前位置(以字节到毫秒为单位)的经验?
更新
很明显,从评论中可以看出,没有精确的方法可以将字节转换为毫秒,反之亦然,而无需将 MP3 文件解码到点(以毫秒或字节为单位),然后确定已读取的字节数或毫秒数那些玩过的。然而,考虑到一个服务器,比如 100 个用户将同时请求文件,这种方法显然不会表现得很好。然后服务器必须将 MP3 文件解码到请求的位置,然后从该位置返回流。我选择用性能来交换精度,并采用了一种方法,该方法可以为我提供近似位置,并且对于仅用于播放曲目(而不是将音频与其他源的音频同步到毫秒)的播放器来说已经足够了。
我所做的是玩家(在客户端)现在只关心毫秒(MS)。也就是说,进度条的当前值和最大值以 MS 为单位,而不是像最初那样以字节为单位。要从任何给定位置开始播放,客户端请求服务器 (servlet) 提供从 MS 中任何给定位置开始的音频流。servlet 使用 JAudioTagger 获取文件的详细信息,然后近似计算 MS 位置对应的字节位置。我已经对它进行了测试,它与 CBR(恒定比特率)文件配合得很好。该方法不适用于 VBR(可变比特率)文件,因为帧大小可能会有所不同。请注意,这只是一个播放器,目的是播放音乐文件。它不打算将音频与其他一些媒体同步到 MS。
更新(2012 年 7 月 3 日)
servlet 已经使用以下代码运行了一段时间,并且运行良好。已经播放了数千个 MP3,从毫秒到字节的近似效果很好。
更新(2017 年 1 月 3 日)
servlet 仍在使用完全相同的代码运行,并且已经很好地播放了数十万个 MP3。在制作期间,没有任何关于播放和时间的抱怨。
/**
* Returns the approximate byte position for any given position in
* milliseconds.
*
* http://www.java2s.com/Open-Source/Android/Mp3/needletagger/org/jaudiotagger/audio/mp3/MP3AudioHeader.java.htm
* http://www.autohotkey.com/forum/topic29420.html
*
* @param file the <code>File</code> for which the byte position for the …Run Code Online (Sandbox Code Playgroud) 我在防火墙后面运行了一个SOLR实例.我即将提出另一个不会被防火墙的实例.但是,SOLR似乎只支持拉复制而不是推送复制.
关于保持相同安全级别,我有哪些选择?我宁愿不在防火墙中打开太多端口.HTTP隧道上的HTTP是最好的选择吗?是否也可以使用普通的旧rsync(不使用任何SOLR特定功能)复制索引文件,或者这会破坏什么?
我正在开发一个Web应用程序,它需要立即清除过期的缓存元素.我想使用Quartz框架执行此操作,并有一个单独的工作来参与此操作.
现在,我在其他项目中使用了Quartz,并且通常使用contextInitialised(ServletContextEvent sce)和contextDestroyed(ServletContextEvent sce)从ServletContextListener安排所有作业.但是,我这样做了,因为我曾经读过的教程是这样做的.
我不确定我是否可以从servlet的init()和destroy()方法中安排任务?我想有人可能会说我现在正在混合后台任务和servlet,从而有责任,但是我想听听是否有"最佳实践"?
这是一个关于我的代码中发生了什么的问题.它有效,但我需要一点启示......
我正在使用jQuery在文本输入元素上创建一个事件监听器.HTML将简单如下:
<input type="text" id="autocomplete" size="50" />
Run Code Online (Sandbox Code Playgroud)
每当有人在该字段中键入内容时,我都需要接收事件,并且为了避免被事件淹没,我已经使用计时器设置了事件监听器,这样我的事件监听器代码只有在用户没有输入125 ms的内容时才会运行:
jQuery('#autocomplete').keyup(function(e) {
e.preventDefault();
clearTimeout(this.timer);
this.timer = setTimeout(function() {
jQuery.getJSON([URL goes here], function(data) {
// processing of returned data goes here.
}
}, 125);
console.log(this);
});
Run Code Online (Sandbox Code Playgroud)
这有效,但我不太确定我是否理解这里发生的一切.从上面的代码中可以看出,我需要跟踪ID在最后一个事件中创建的计时器.我通过存储它来做到这一点this.timer.但是,this在这种情况下,关键字是指输入元素.这是console.log输出:
<input type="text" id="autocomplete" size="50" />
Run Code Online (Sandbox Code Playgroud)
将计时器存储ID在输入元素上是否可以?据我所知,我可能会做一些愚蠢的事情.这是"最佳实践",还是会有不同之处?
我正在使用Solr的schema.xml,我知道我可以使用'default'属性来指定一个默认值,如果没有提供给定字段的值,则使用该值.但是,假设我选择不设置'default'属性,那么Solr的默认值会回落到?
我认为我用于给定字段的字段类型将具有将使用的默认值,但是我没有成功找到关于此的任何细节.或者,我认为不提供值而不是有效地设置默认值就好像该字段不存在于特定文档中一样.
但是,我不确定,我想知道:-)
更新1
据我所知,如果没有设置默认值且没有为给定字段提供任何值,Solr只会抛出错误并返回错误400"错误请求".换句话说,如果没有提供任何值且在schema.xml中没有设置默认值,Solr似乎不会应用任何"回退"默认值.
更新2
我的上述更新似乎是错误的.如果没有为字段提供任何值,并且没有为该字段设置默认值,则Solr将仅将该字段视为该特定文档不存在.当然,如果需要该字段,则此行为不适用.