我尝试在第一个数组中保留一些值,然后在第二个数组中保持另一个值,我尝试打印第一个数组并返回第二个数组值。有什么想法吗?
这是调用程序的主要方法
public class testC
{
public static void main(String[] args)
{
groupC trial = new groupC();
trial.setCol(10, 10);
}
}
这是类调用另一个类来获取颜色并在每个新坐标中填充数组
public class groupC
{
private color1 col = new color1();
private int[] cola1 = new int[3];
private int[] cola2 = new int[3];
public groupC()
{
}
public void setCol(int xIn, int yIn)
{
cola1 = col.getCol(xIn, yIn);
System.out.println(cola1[0] + " " + cola1[1] + " " + cola1[2]);
/* try next color depending on 1st */
cola2 = col.getCol(xIn + 100, yIn + 100);
System.out.println(cola2[0] + " " + cola2[1] + " " + cola2[2]);
System.out.println("this is 1st color, but why now the same as 2nd ?" + cola1[0] + " " + cola1[1] + " " + cola1[2]);
}
}
这是类,它只是获取坐标并返回该点的颜色值数组
import java.awt.Color;
import java.awt.Robot;
import java.awt.AWTException;
public class color1
{
int[] color = new int[3];
public color1()
{
}
public int[] getCol(int xIn, int yIn)
{
// accepts position of color, returns size 3 array of red green blue
// integers
try
{
Robot r = new Robot();
Color x = r.getPixelColor(xIn, yIn);
color[0] = x.getRed();
color[1] = x.getGreen();
color[2] = x.getBlue();
}
catch (AWTException e)
{
e.printStackTrace();
}
return color;
}
}
答案 0 :(得分:3)
因为color1
重用单个数组:
public class color1
{
int[] color = new int[3]; // <== Creates one array for this color1 instance
// ...
}
getCol
中发生的一切都是(再次)填写:
Color x = r.getPixelColor(xIn, yIn);
color[0] = x.getRed(); // <==== Nothing here is creating a new color array
color[1] = x.getGreen();
color[2] = x.getBlue();
如果要使用多个数组,则必须实际创建多个数组。这可能意味着完全删除color
实例成员,并在getCol
中创建数组:
import java.awt.Color; import java.awt.Robot; import java.awt.AWTException;
public class color1
{
public color1()
{
}
public int[] getCol(int xIn, int yIn)
{
// accepts position of color, returns size 3 array of red green blue
// integers
int[] color = new int[3]; // Has to be here because of how you're (not) handling exceptions
try
{
Robot r = new Robot();
Color x = r.getPixelColor(xIn, yIn);
color[0] = x.getRed();
color[1] = x.getGreen();
color[2] = x.getBlue();
}
catch (AWTException e)
{
e.printStackTrace();
}
return color;
}
}
答案 1 :(得分:1)
您实际上只填充单个数组 - 并在每次调用getCol
时覆盖它。因此,cola1
和cola2
的值最终会引用相同的数组,而您希望它们引用不同的数组。
您可能应该在getCol
中创建一个新数组,将color
声明为局部变量而不是字段:
// Note rename of method to be more descriptive
public int[] getColorComponents(int xIn, int yIn)
{
int[] components = new int[3];
// accepts position of color, returns size 3 array of red green blue
// integers
try
{
Robot r = new Robot();
Color x = r.getPixelColor(xIn, yIn);
components[0] = x.getRed();
components[1] = x.getGreen();
components[2] = x.getBlue();
}
catch (AWTException e)
{
e.printStackTrace();
}
return components;
}
(顺便说一下,通过捕获它们来处理“处理”异常,打印堆栈跟踪然后继续,好像什么都没有出错几乎从来都不是正确的方法。此外,你应该在你的命名工作 - 没有你的班级名称描述了它们的用途,并且都违反了Java命名约定。)
答案 2 :(得分:0)
数组变量是Java中的引用,因此如果您将一个数组变量分配给另一个,并修改其中一个,那么另一个也会被修改:
int[] a = new int[3];
int[] b;
b = a;
b[0] = 42;
System.out.println(a[0]); //: 42
要解决此问题,请将以下内容添加到getCol
的开头:
color = new int[3];
更好:将color
作为getCol
的本地变量:
int[] color = new int[3];