Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何动态计算颜色列表?_Java_Gwt_Colors - Fatal编程技术网

Java 如何动态计算颜色列表?

Java 如何动态计算颜色列表?,java,gwt,colors,Java,Gwt,Colors,为了在GWT小部件中表示具有不同颜色的对象列表,我们需要动态获取具有与对象相同颜色的颜色列表。由于列表的大小可能会有所不同,我们需要能够计算出这样一个颜色列表。我想这样的东西就可以了。没有随机性,只需计算要采取的颜色步骤,并将所有颜色范围拆分为该步骤。如果你限制下限-你将删除太暗的颜色,限制上限将删除太亮的颜色 List<Integer> getUniqueColors(int amount) { final int lowerLimit = 0x101010; fi

为了在GWT小部件中表示具有不同颜色的对象列表,我们需要动态获取具有与对象相同颜色的颜色列表。由于列表的大小可能会有所不同,我们需要能够计算出这样一个颜色列表。

我想这样的东西就可以了。没有随机性,只需计算要采取的颜色步骤,并将所有颜色范围拆分为该步骤。如果你限制下限-你将删除太暗的颜色,限制上限将删除太亮的颜色

List<Integer> getUniqueColors(int amount) {
    final int lowerLimit = 0x101010;
    final int upperLimit = 0xE0E0E0;
    final int colorStep = (upperLimit-lowerLimit)/amount;

    final List<Integer> colors = new ArrayList<Integer>(amount);
    for (int i=0;i<amount;i++) {
        int color = lowerLimit+colorStep*i;
        colors.add(color);
    }
    return colors;
}
List getUniqueColor(整数金额){
最终整数下限=0x101010;
最终整数上限=0xE0;
最终int colorStep=(上限下限)/金额;
最终列表颜色=新的ArrayList(金额);

对于(int i=0;i如果我理解你的情况是正确的,那么你想要的是一系列看起来“尽可能不同”的颜色?在这种情况下,我建议你改变色调值(两种亮度稍有不同的红色看起来不会有太大的不同),因此你可以得到类似“彩虹调色板”的东西:

这可以通过以下代码实现:

Color[] cols = new Color[n];
for (int i = 0; i < n; i++)
    cols[i] = Color.getHSBColor((float) i / n, 1, 1);
Color[]cols=新颜色[n];
对于(int i=0;i

下面是屏幕截图的使用示例:

import java.awt.*;

public class TestComponent extends JPanel {

    int numCols = 6;

    public void paint(Graphics g) {

        float h = 0, dh = (float) getHeight() / numCols;
        Color[] cols = getDifferentColors(numCols);

        for (int i = 0; i < numCols; i++) {
            g.setColor(cols[i]);
            g.fillRect(0, (int) h, getWidth(), (int) (h += dh));
        }
    }

    public static Color[] getDifferentColors(int n) {
        Color[] cols = new Color[n];
        for (int i = 0; i < n; i++)
            cols[i] = Color.getHSBColor((float) i / n, 1, 1);
        return cols;
    }

    public static void main(String s[]) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new TestComponent());
        f.setSize(200, 200);
        f.setVisible(true);
    }
}
import java.awt.*;
公共类TestComponent扩展了JPanel{
int numCols=6;
公共空间涂料(图g){
float h=0,dh=(float)getHeight()/numCols;
颜色[]cols=获取不同的颜色(numCols);
对于(int i=0;i
numCols=6
numCols=40
生成以下两个屏幕截图:


如果您需要30多种颜色,您当然可以更改亮度,也可以更改饱和度,例如,有10种深色、10种中间色和10种亮色。

我的解决方案的另一个版本,具有以下范围:

List<Integer> getUniqueColors(int amount) {
    final int lowerLimit = 0x101010;
    final int upperLimit = 0xE0E0E0;
    final int colorStep = (upperLimit-lowerLimit)/amount;

    final List<Integer> colors = new ArrayList<Integer>(amount);
    for (int i=0;i<amount;i++) {
        int color = lowerLimit+colorStep*i;
        colors.add(color);
    }
    return colors;
}
List<int> getUniqueColors(int amount) {
    final int lowerLimit = 0x10;
    final int upperLimit = 0xE0;    
    final int colorStep = (upperLimit-lowerLimit)/Math.pow(amount,1f/3);

    final List<int> colors = new ArrayList<int>(amount);

    for (int R = lowerLimit;R < upperLimit; R+=colorStep)
        for (int G = lowerLimit;G < upperLimit; G+=colorStep)
            for (int B = lowerLimit;B < upperLimit; B+=colorStep) {
                if (colors.size() >= amount) { //The calculated step is not very precise, so this safeguard is appropriate
                    return colors;
                } else {
                    int color = (R<<16)+(G<<8)+(B);
                    colors.add(color);
                }               
            }
    return colors;
}
List getUniqueColor(整数金额){
最终整数下限=0x10;
最终整数上限=0xE0;
最终int colorStep=(上限下限)/数学功率(金额,1f/3);
最终列表颜色=新的ArrayList(金额);
for(int R=下限;R<上限;R+=颜色步长)
for(int G=下限;G<上限;G+=颜色步长)
对于(int B=下限;B<上限;B+=颜色步长){
如果(colors.size()>=amount){//,则计算的步长不是很精确,因此此保护措施是适当的
返回颜色;
}否则{

整数颜色=(请在底部查看此解决方案的另一个版本。它生成的结果比此解决方案好得多,但有点复杂。这甚至不可编译。java中不能有
int
列表。您可能希望将其更改为
Integer
。如果您想跳过灰色-一些额外的ca需要进行计算。如果(r==g==b),则需要一些
if(r==g==b),然后在循环中继续
,还需要通过
Math.pow(amount,1f/3)
增加
数量
(以使跳过灰色成为可能)。或者您可以坚持改变色调;)是的,但我对HSV不太在行,所以我提出了我想到的第一件事。