最简单地说,我试图使用组件的宽度来设置其父容器的大小。但是,为组件返回的宽度偏移了大约 4 个像素。
更多详情: 我有一个对话框,其中的子面板在中间水平分布。对话框应始终与此子面板列表一样宽,并在列表太长时使用滚动条。我只是尝试使用 1 个子面板来开始。无论我做什么,返回的子面板的大小总是错误大约 4 个像素。我可以看到子面板右侧有一个非常烦人的 4 像素间隙,使我的对话框看起来很可怕。随着更多子面板的添加,效果显然会更加复杂。
我尝试使用什么来获取宽度:
sup-panel.getSize().width;
sub-panel.getBounds().width;
sub-panel.getWidth();
sub-panel.getPreferredSize().width;
所有返回相同的错误值。
我尝试调用以使其正常运行的其他东西:
parent.validate();
parent.repaint();
parent.doLayout();
如有任何帮助,我们将不胜感激。是故意的吗?我是否缺少尺寸背后的一些概念?这看起来是一致的,但如果我能在某处读到这被记录在案,那就太好了。
仅供引用:我使用的是 java 1.3(支持旧版应用)
注意:这不是调整窗口大小的问题,这部分发生得很好。子面板的大小似乎已正确设置,因为对其大小的更改反射(reflect)在为我的代码返回的值中。这些值总是略有偏差。
注意 2:在父容器上调用 pack() 使窗口看起来像我想要的那样,但它不适用于我的所有情况,因为最终在出现足够多的子面板后需要出现滚动条.在这种情况下,pack() 只会使我的对话框超宽,并使滚动条无用。
编辑: 我已经解决了我的问题。相当尴尬的是,我所有的子面板都没有像它们应该的那样具有统一的宽度。有 2 种解决方案有效。强制它们全部统一,这可能会很棘手,具体取决于您对布局的掌握程度。另一个是总结我希望可见的前 n 个面板的各个宽度。请注意,为了使此解决方案有效,我必须为每个子组件的宽度添加一个额外的 +1。不知道为什么,但我用各种边框和布局测试了它,它非常一致;我想可能有一个像素的额外空间是我没有认真考虑的地方。但重要的是它现在可以完美运行。下面是一个数学示例(抱歉老派的无类型集合需要强制转换,Java 1.3):
int width = 0;
for(int i = 0; i < MAX_VISIBLE_PANELS; i++)
{
width += ((SubPanel)panelList.get(i)).getWidth();
width ++;//extra pixel per panel
}
最佳答案
我想到了两件事:
您可以使用 validate()在 pack() 之前建立子面板的几何形状供以后引用,如本 example 所示.
您可能需要考虑 FlowLayout 指定的默认间隙,这是 JPanel 的默认布局。
关于Java Swing getSize() 返回不准确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6231675/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
所以我开始关注ruby,很多东西看起来不错,但我对隐式return语句很反感。我理解默认情况下让所有内容返回self或nil但不是语句的最后一个值。对我来说,它看起来非常脆弱(尤其是)如果你正在使用一个不打算返回某些东西的方法(尤其是一个改变状态/破坏性方法的函数!),其他人可能最终依赖于一个返回对方法的目的并不重要,并且有很大的改变机会。隐式返回有什么意义?有没有办法让事情变得更简单?总是有返回以防止隐含返回被认为是好的做法吗?我是不是太担心这个了?附言当人们想要从方法中返回特定的东西时,他们是否经常使用隐式返回,这不是让你组中的其他人更容易破坏彼此的代码吗?当然,记录一切并给出
为什么以下不同?Time.now.end_of_day==Time.now.end_of_day-0.days#falseTime.now.end_of_day.to_s==Time.now.end_of_day-0.days.to_s#true 最佳答案 因为纳秒数不同:ruby-1.9.2-p180:014>(Time.now.end_of_day-0.days).nsec=>999999000ruby-1.9.2-p180:015>Time.now.end_of_day.nsec=>999999998
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
我一直在研究RubyKoans,我发现about_open_classes.rbkoan很有趣。特别是他们修改Integer#even?方法的最后一个测试。我想尝试一下这个概念,所以我打开了Irb并尝试运行Integer.respond_to?(:even?),但令我惊讶的是我得到了错误。然后我尝试了Fixnum.respond_to?(:even?)并得到了错误。我还尝试了Integer.respond_to?(:respond_to?)并得到了true,当我执行2.even?时,我也得到了true。我不知道发生了什么。谁能告诉我缺少什么? 最佳答案
假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)
我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod