【发布时间】:2011-02-20 16:40:27
【问题描述】:
在 .NET 中,您可以实现以下目标:
Color yellowColor = Color.FromName("yellow");
有没有办法在 Java 中做到这一点而不必求助于反射?
PS:我不是在要求存储/加载颜色的替代方法。我只是想知道在哪里可以做到这一点。
【问题讨论】:
在 .NET 中,您可以实现以下目标:
Color yellowColor = Color.FromName("yellow");
有没有办法在 Java 中做到这一点而不必求助于反射?
PS:我不是在要求存储/加载颜色的替代方法。我只是想知道在哪里可以做到这一点。
【问题讨论】:
使用反射访问Color 类的静态成员。
Color color;
try {
Field field = Class.forName("java.awt.Color").getField("yellow");
color = (Color)field.get(null);
} catch (Exception e) {
color = null; // Not defined
}
【讨论】:
我尝试了类似的方法并且它有效(至少对于 JavaFX)
String color = "red";
Color c = Color.web(color);
gc.setFill(color);
gc.fillOval(10, 10, 50, 40);
【讨论】:
为什么不为此创建一个自定义类?我这样做了,它对我有用。 注意:你必须在你的包中包含这个类。
import java.awt.Color;
/**
* A class to get the Color value from a string color name
*/
public class MyColor {
private Color color;
public MyColor(){
color = Color.WHITE;
}
/**
* Get the color from a string name
*
* @param col name of the color
* @return White if no color is given, otherwise the Color object
*/
static Color getColor(String col) {
switch (col.toLowerCase()) {
case "black":
color = Color.BLACK;
break;
case "blue":
color = Color.BLUE;
break;
case "cyan":
color = Color.CYAN;
break;
case "darkgray":
color = Color.DARK_GRAY;
break;
case "gray":
color = Color.GRAY;
break;
case "green":
color = Color.GREEN;
break;
case "yellow":
color = Color.YELLOW;
break;
case "lightgray":
color = Color.LIGHT_GRAY;
break;
case "magneta":
color = Color.MAGENTA;
break;
case "orange":
color = Color.ORANGE;
break;
case "pink":
color = Color.PINK;
break;
case "red":
color = Color.RED;
break;
case "white":
color = Color.WHITE;
break;
}
return color;
}
}
在某些Container 我只是这样称呼它
public JPanel createStatusBar(){
JPanel statusBar = new JPanel(layoutManager);
statusBar.setBackgroundColr(MyColor.color("green"));
// and other properties
return statusBar;
希望这会有所帮助。
【讨论】:
我开源了一个名为 AWT Color Factory 的小库,它提供了从字符串表示创建 java.awt.Color 实例的方法。
这些方法与 javafx.scene.paint.Color 中可用的静态方法相对应,例如 Color.web(...) 或 Color.valueOf(...)
该库非常轻量级,不依赖于 JavaFX。
【讨论】: