数组中的网格颜色为特定颜色的三元运算符(多个条件)Java

Ternary Operator for grid color in array to be a specific color (multiple conditions) Java

我正在构建一个 GUI 以使用 GridLayout 显示地图,并希望以不同的颜色显示它。截至目前,我已经知道,如果数组中的数字等于 0,则该特定方块的颜色将为黑色。如果是任何其他数字,它将是灰色的。如您所见,这将是一张非常无聊的网格地图。有没有办法采用这行代码并使每个数字都代表一种颜色?例如,我想0等于黑色,1等于灰色,2等于蓝色,3等于红色,4等于绿色等等。这就是我现在的。

颜色颜色=数据[r][c] == 0 ? Color.BLACK : Color.gray;

我知道我可以只使用 if 语句根据数字确定将哪种颜色放在那里,但我知道有一种方法可以使用三元运算符来实现。任何人都知道如何?谢谢。

怎么样:

Map<Integer, Color> colors = new HashMap(); 
colors.put(0, Color.BLACK);
//...

function Color getColor(Integer i)
{
    return colors.containsKey(i)? colors[i] : Color.gray;
}

对你有帮助吗?

我们说的是多少种颜色?

如果颜色数量不多,只需将它们放入贴图即可。

Map<Integer, Color> colorMap = Map.of(0, Color.BLACK, 1, Color.GRAY, 2, Color.BLUE, 3, Color.RED, 4, Color.GREEN); // Java >= 9
Color color = colorMap.getOrDefault(data[r][c], Color.gray):

声明这个数组:

Color[] colors = {  
    Color.BLACK, Color.WHITE, Color.LIGHT_GRAY, Color.GRAY,
    Color.DARK_GRAY, Color.RED, Color.PINK, Color.ORANGE, 
    Color.YELLOW, Color.GREEN, Color.MAGENTA, Color.CYAN, Color.BLUE
};

这个数组的值都是Color.java中的Color个常量,你可以重新排列它们。
现在像这样设置颜色:

Color color = colors(data[r][c] % colors.length);

对于任何大于等于 0 的 data[r][c] 整数值。

您有一个 int 值。并且您想为此 int 值获取 Color

可以为此使用if语句:

if (value == 0) color = Color.RED;
if (value == 1) color = Color.GREEN;
if (value == 2) color = Color.BLUE;

可以为此使用switch语句:

switch (value) {
    case 0: color = Color.RED; break;
    case 1: color = Color.GREEN; break;
    case 2: color = Color.BLUE; break;
}

可以为此使用三元运算符:

color = (value==0?Color.RED:(value==1?Color.GREEN:value==3?Color.BLUE)));

(不要那样做....)

可以为此使用Map:

Map<Integer, Color> colorMap = mapWith(
    0, Color.RED, 
    1, Color.GREEN, 
    2, Color.BLUE);
...
Color color = colorMap.get(value):

但退后一步,看看您想要完成什么:您想将 int 值放在某个地方,并获得 Color。所以写一个函数

private static Color colorFor(int value) {
    ...
}

然后需要颜色的地方写

Color color = colorFor(value);

无论您是使用 ifswitch、三元运算符还是 Map 实现 colorFor 函数,都不再重要。您可以轻松切换实现。


"Advanced":

你还可以更进一步,提取出实际的功能:当你想把一个int转换成一个Color时,这正是用[=37表示的=].

乍一看,它可能看起来像是一种抽象矫枉过正。但我认为不是(否则我不会写它作为答案)。

所以您可以根据需要定义 IntFunction,在 GUI 代码中您有 int 值并需要 Color 的地方,您只需

Color color = colorFunction.apply(value);

这样做的一个可能的好处是您可以从外部轻松切换配色方案,如下所示:

class YourGui {

    // Initialize with some default  
    private IntFunction colorFunction = YourGui::colorFor; 

    // The function as described above
    private static Color colorFor(int value) {
        ...
    }

    void setColorScheme(IntFunction colorFunction) {
        this.colorFunction = colorFunction;
    }
}

然后调用

yourGui.setColorScheme(colorFunctionWith(CYAN, MAGENTA, YELLOW));

更改单元格着色方案。