我目前正在为我正在工作的公司的产品开发一组自定义控件.为此,我扩展了很多Swing控件并且还覆盖了很多paint方法.
为了保持一致的配色方案,我收到了我的颜色paint,setBackground使用方法等UIManager.getColor.
这是完全没问题的,直到我们注意到Nimbus LookAndFeel与当前的JRE版本一起使用时,使用了完全不同的颜色键,因此许多东西看起来完全不合适.
例如,虽然所有其他股票LookAndFeels(金属,Windows经典,Windows,CDE/Motif,GTK)已将关键字"文本"定义为文本的明亮背景,而"textText"则定义为相应的前景色,而" Nimbus "中的"文本"实际上是黑色前景色,并且似乎不存在标准文本背景色.
"TextField.background"可以工作,但是,例如,Windows LookAndFeels不存在.
我想你现在已经解决了这个问题.我不想为每个LAF维护一组颜色键,谁知道未来将添加哪些LAF以及我的公司可能决定使用哪些.
当然,一个简单的解决方案是摆脱Nimbus,但可以理解的是我的老板根本不喜欢这个想法,除了Nimbus现在是JRE的一部分,应该得到支持.
所以我想知道是否有任何标准化的方法来获得依赖于LAF的颜色,例如"文本背景/前景","选择文本bg/fg"等等?
我正在尝试调用newInstanceScala类的构造函数的方法(case类或通常的类,都受到影响).
但是,我遇到IllegalArgumentException了一个提示错误的参数.
考虑以下:
case class Vec2(x: Float, y: Float)
object TestApp {
def main(args: Array[String]) {
//after some research I found the last constructor always to be the default
val ctor = classOf[Vec2].getConstructors.last
println("ctor = " + ctor)
println("takes parameters: " + ctor.getParameterTypes.length)
val params = new Array[Float](2)
params.update(0, 1.0f)
params.update(1, -1.0f)
println("num parameters: " + params.length)
println("trying to create new instance...")
try {
val x = ctor.newInstance(params)
println("new instance: " + x)
} …Run Code Online (Sandbox Code Playgroud) 在Java,Scala或通常任何JVM语言中,默认情况下会导入一组包.例如,Java会自动导入java.lang,您不需要在Java代码文件中执行此操作.
现在我不知道哪个组件完全处理这个问题(编译器?JVM?),但有没有办法在默认情况下导入其他包甚至类?
假设你有一个包定义了你在整个项目中使用的一组实用函数(一个例子可能scala.math在Scala中),如果你能够在每个数学相关的类中跳过它的导入,那就太好了.
我最近将公司的一个项目导入IntelliJ Idea(10.5.1)。我们使用蚂蚁构建脚本来构建和运行项目,而IntelliJ支持它就好了。
但是,当编译输出目录等于源代码目录时,即.class文件与它们的相应.java源位于相同的目录中时,IntelliJ似乎有一个明显的问题。
(请注意,我知道这不是一个正确的方法,但请告诉我的老板。该项目已有15年的历史了,而且规模相当大,要依靠这种方式的事情太多了,我无能为力那。)
因此,一旦编译完成,IntelliJ就会检测到.class文件并将其添加到项目树中。这里的问题是它考虑了它们的类声明,因此我为每个类都收到“找到重复的类”消息。这不会使我无法工作,但是您可能会猜到这非常烦人。
我尝试使IDE忽略.class文件,但显然,这使其根本不加载任何类,包括JRE运行时和.jar文件内的其他任何类。
有什么方法可以使IntelliJ Idea忽略.class与.java源文件位于相同位置的文件?
我正在处理一个Polygon类,它包含一个顶点数组Array[Vec2](用Vec2一个简单的case类来定义x和y).
现在,我想实现一个函数来返回多边形的边缘Array[LineSegment](其中LineSegment又是一个定义开始和结束的简单案例类).
解决方案是创建将每个顶点连接到数组中的下一个顶点的线段,最后将最后一个顶点连接到第一个顶点.
我只习惯于命令式编程,所以这是我的必要方法:
def edges: Array[LineSegment] = {
val result = new Array[LineSegment](vertices.length)
for (i <- 0 to vertices.length - 2) {
result.update(i, LineSegment(vertices.apply(i), vertices.apply(i + 1)))
}
result.update(edges.length - 1, LineSegment(vertices.head, vertices.last))
result
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但很简单.我想在这里使用函数式编程的优点,但我仍然坚持这一点.
我的想法是把它写成类似于这样的东西:
def edges: Array[LineSegment] = {
for (v <- vertices) yield
LineSegment(v, if (v == vertices.last) vertices.head else /* next? */)
}
Run Code Online (Sandbox Code Playgroud)
问题是,在给定当前项目的情况下,无法访问数组中的下一个项目v.
我已经读过关于sliding定义的方法IterableLike,但是这似乎是非旋转的,即它不会考虑第一个项目在最后一个项目之后,因此不会返回它.
那么什么是一个很好的"scala-esque"方法呢?