Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.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_Swing - Fatal编程技术网

Java对已添加的对象进行更改

Java对已添加的对象进行更改,java,swing,Java,Swing,我目前正在为学校做一个小项目,我还处在一个开始。我刚刚开始阅读JFrame和所有这些东西,所以不要奇怪为什么我可能不太熟悉您将向我展示的所有内容 现在的目标是要有一个程序,给出一个图像,并能够改变该图像的每一个像素手动。因此,我编写了以下代码: public class JavaGraphicsTest { private static Pixel pixel; public static void main(String[] args) { JFrame fr

我目前正在为学校做一个小项目,我还处在一个开始。我刚刚开始阅读JFrame和所有这些东西,所以不要奇怪为什么我可能不太熟悉您将向我展示的所有内容

现在的目标是要有一个程序,给出一个图像,并能够改变该图像的每一个像素手动。因此,我编写了以下代码:

public class JavaGraphicsTest {
    private static Pixel pixel;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
        pixel = new Pixel(1600, 900);
        frame.getContentPane().add(pixel);
        //pixel.testChange();
    }
}
以及:

公共类像素扩展组件{
专用缓冲图像img;
私有整数宽度;
私人内部高度;
私有图形;
公共像素(整数w,整数h){
宽度=w;
高度=h;
}
公共void create(){
img=新的BuffereImage(宽度、高度、BuffereImage.TYPE\u INT\u RGB);
//现在设置任何颜色
对于(int-wc=0;wc
好的,到目前为止,代码仍然有效(在发现xD的严重错误数小时之后),但我现在想做的事情似乎还不起作用:我想在main方法中调用方法“pixel.testChange()”(它目前已被注释)。但就我所了解的JFrame是如何工作的而言,一旦我将对象添加到JFrame中,我就不能对它做任何事情。但是,谁应该这样做呢?如何修改任何活动对象而不删除并重新添加它

PS:如果您不明白testChange方法应该做什么:它应该将图像的两个块更改为另一种颜色,这基本上是一个测试,看看我是否成功更改了图像

如果您需要有关该项目的更多信息,请询问我:)

提前感谢,,
Julian

在您的
testChange
方法结束时(或在调用它之后),您应该调用
Pixel
对象上的
invalidate
,这是一个通知组件在其被更改时重新绘制的信号


同时检查。

testChange
方法的末尾(或在调用它之后),您应该调用
Pixel
对象上的
invalidate
,这是一个通知组件在其被更改时重新绘制的信号


同时检查。

不要存储
图形对象。永远

public class Pixel extends Component {
    private Graphics graphics;  // <<-- DO NOT DO THIS

    @Override
    public void paint(Graphics g) {
        // ...
        graphics = g;    // <<-- DO NOT DO THIS
        // ...
    }
}
但是您可以安全地将
Graphics
对象传递给从
paint(Graphics g)
调用的其他方法

嗯。对于手头的业务—您的
#testChange()
方法。更改图像后,只需使用
#repaint()
调用,让Swing再次绘制组件即可

public class Pixel extends Component {

    public void testChange() {
        int rgb = new Color(0xFF8876).getRGB());  // Cached, for efficiency.

        for(int i = 50; i < 80; i++) {
            for(int  j = 80; j < 120; j++) {
                img.setRGB(i, j, rgb);
            }
            for(int  j = 460; j < 493; j++) {
                img.setRGB(i, j, rgb);
            }
        }

        repaint(); // <<-- Ask Swing to repaint the component.
    }
}
噢,使用Java8,您可以摆脱大部分的
Runnable
锅炉板代码:

public static void main(String[] args) {
    SwingUtilities.invokeLater( () -> {
        JFrame frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);             // <<-- Window becomes visible here
        pixel = new Pixel(1600, 900);
        frame.getContentPane().add(pixel);  // <<-- Safe - running on EDT.
        pixel.testChange();  // <<-- Also safe - running on EDT
    });
}
publicstaticvoidmain(字符串[]args){
SwingUtilities.invokeLater(()->{
JFrame=新JFrame();
setExtendedState(JFrame.MAXIMIZED_二者);

frame.setVisible(true);//永远不要存储
图形
对象

public class Pixel extends Component {
    private Graphics graphics;  // <<-- DO NOT DO THIS

    @Override
    public void paint(Graphics g) {
        // ...
        graphics = g;    // <<-- DO NOT DO THIS
        // ...
    }
}
但是您可以安全地将
Graphics
对象传递给从
paint(Graphics g)
调用的其他方法

好的。对于手头的业务—您的
#testChange()
方法。更改图像后,您只需使用
#repaint()
调用让Swing再次绘制组件

public class Pixel extends Component {

    public void testChange() {
        int rgb = new Color(0xFF8876).getRGB());  // Cached, for efficiency.

        for(int i = 50; i < 80; i++) {
            for(int  j = 80; j < 120; j++) {
                img.setRGB(i, j, rgb);
            }
            for(int  j = 460; j < 493; j++) {
                img.setRGB(i, j, rgb);
            }
        }

        repaint(); // <<-- Ask Swing to repaint the component.
    }
}
噢,使用Java8,您可以摆脱大部分的
Runnable
锅炉板代码:

public static void main(String[] args) {
    SwingUtilities.invokeLater( () -> {
        JFrame frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);             // <<-- Window becomes visible here
        pixel = new Pixel(1600, 900);
        frame.getContentPane().add(pixel);  // <<-- Safe - running on EDT.
        pixel.testChange();  // <<-- Also safe - running on EDT
    });
}
publicstaticvoidmain(字符串[]args){
SwingUtilities.invokeLater(()->{
JFrame=新JFrame();
setExtendedState(JFrame.MAXIMIZED_二者);

frame.setVisible(true);//嗨,朱利安,欢迎来到stackoverflow!:D我建议研究revalidate()方法。我自己对它们不太了解,但据我所知,它应该做您希望它做的事情。:)@EthanMoore感谢^^^^这似乎是做这件事的基础,但通过更多的错误发现,我发现我目前正在解决的问题是另一个问题:当我调用这行时:
img.setRGB(80,80,新颜色(0xFF8876.getRGB());
在paint()方法中,它是有效的,但在testChange()方法中,我总是得到一个空指针:(但我完全不知道为什么会这样……尝试将
新颜色(0xFF8876).getRGB()
更改为现有值(只需再加80?)然后告诉我发生了什么?@Julianthurner这似乎不是问题^^在撤消图形对象的存储后,错误不再发生…@不要扩展组件。这是一个AWT类。使用Swing时,可以扩展
JComponent
JPanel
。另外,不要覆盖paint()。在Swing中,您应该重写
paintComponent(…)
。嗨,朱利安,欢迎使用stackoverflow!:D我建议研究revalidate()方法。我自己对它们了解不多,但据我所知,它应该做您希望它做的事情。:)@EthanMoore感谢^^^^这似乎是做这件事的基础,但通过更多的错误发现,我发现我目前正在解决的问题是另一个问题:当我调用这行时:
img.setRGB(80,80,新颜色(0xFF8876.getRGB());
在paint()方法中,它是有效的,但在testChange()方法中,我总是得到一个空指针:(但我完全不知道为什么会这样……试着改变
新颜色(0xFF)
public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    pixel = new Pixel(1600, 900);
    frame.getContentPane().add(pixel);  // <<-- Safe - window not visible yet.
    frame.setVisible(true);             // <<-- Window becomes visible here
}
public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JFrame frame = new JFrame();
            frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
            frame.setVisible(true);             // <<-- Window becomes visible here
            pixel = new Pixel(1600, 900);
            frame.getContentPane().add(pixel);  // <<-- Safe - running on EDT.
            pixel.testChange();  // <<-- Also safe - running on EDT
        }
    });
}
public static void main(String[] args) {
    SwingUtilities.invokeLater( () -> {
        JFrame frame = new JFrame();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);             // <<-- Window becomes visible here
        pixel = new Pixel(1600, 900);
        frame.getContentPane().add(pixel);  // <<-- Safe - running on EDT.
        pixel.testChange();  // <<-- Also safe - running on EDT
    });
}