Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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_Graphics_Awt - Fatal编程技术网

Java中可以更改像素值的方法

Java中可以更改像素值的方法,java,swing,graphics,awt,Java,Swing,Graphics,Awt,我正在用java编写一种动画程序,用于可视化。我正在使用swing和awt库。我研究了十几种实现,它们都使用paint组件方法,然后repaint()在JFrame上绘制形状 是否有一些方法可以从我想要的任何类调用,例如可以更改单个像素值 我还想制作一个包含形状的数组列表: ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>(); 但我不确定应该是什么。 我对这方面比较陌生,所以如果我遗漏了一些明显的东

我正在用java编写一种动画程序,用于可视化。我正在使用
swing
awt
库。我研究了十几种实现,它们都使用
paint
组件方法,然后
repaint()
在JFrame上绘制形状

是否有一些方法可以从我想要的任何类调用,例如可以更改单个像素值

我还想制作一个包含形状的数组列表:

ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>(); 
但我不确定应该是什么。 我对这方面比较陌生,所以如果我遗漏了一些明显的东西,请随意表达你的观点

是否有一些方法可以从我想要的任何类调用,例如可以更改单个像素值

您可以创建一个BuffereImage,它有一个
setRGB(…)
方法,通过使用Graphics
drawImage(…)
方法在
paintComponent(…)
方法中绘制图像,可以实现您想要的效果


关于
Rectangle rect=“something”
——只需在中查找可用的矩形构造函数,并使用最适合您的构造函数即可。

显然,当我称每个人都是使用重绘()的白痴时,我是在咆哮;这是更好的办法。 假设我想在jframe上创建一个矩形、图像、直线或椭圆形

公共JFrame=新JFrame()
公共空间喷漆室(){
//设置jframe和stuff
System.out.println(“这是一个矩形”);
paintARectangle(frame.getGraphics(),42256);
}
公共虚空绘制矩形(图形g、int xCoord、int yCoord、int WITH、int height){
g、 填充(xCoord,yCoord,宽度,高度);
//就这么简单
}
//您可以拥有任意数量的
公共空间,不管什么(图形g,什么都行){
g、 用(任何东西)做某事;
//在oracle发布版本238249.3432.4之前,这实际上是行不通的
}
//关键是使用frame.getGraphics()方法
//重新喷漆是不必要的,也是有限制的


已建议使用<代码> GETFICH <代码> >代码> PruttCys,让我们再看一下……

哎呀,哦,那可不是我们想象的那样!我们甚至可以忽略为什么不应该直接绘制顶级容器(因为这是在标题栏下绘制的)

好的,让我们看看
paintComponent
repaint

Swing有很好的绘图过程文档,请查看和了解更多细节,您应该在API的设计范围内工作

在有人跳下我的喉咙建议你使用
WindowListener
ContainerListener
或其他监听器之前,答案是,为什么<代码>油漆组件工作正常

Swing使用被动渲染引擎,这意味着绘制可能出于多种原因而发生,大多数情况下,您不需要实例化或了解这些原因,因此,除非链接到绘制过程中,否则您不会知道绘制已经发生,调整大小是演示绘制的一种非常好的方法


因此,我们能不能停止建议一些不好的方法,比如使用
getGraphics
或使用
null
布局或
keylister
DocumentListener
对文本组件进行实时过滤,也许我们可以拯救一大群人一大群头痛的人类?否,Swing不是线程安全的。阅读此处的所有教程:使用适当的ab。更改模型的状态并允许控制器/视图更新视图。在大多数情况下,位图blit与单像素操作一样快(可能更快)。如果您需要直接控制绘制过程,则需要考虑使用,另请参阅了解更多详细信息。您的绘制组件很弱且有限。@S.拉夫哈尼:请详细说明和教育——您是根据什么标准做出此声明的?另外,在您最近的回答中包含了您的代码,如果您最小化GUI并恢复它会发生什么?绘制的图像是否持久?@HovercraftFullOfEels由Oracle和Sun记录,并且,
paintComponent
是正确的方法,这在作为communitu提供的两个可运行示例中突出显示wiki@S.Roughani解决问题的设计是薄弱和有限的。如果您可以发布一个非常小但完整的示例程序,一个我们可以测试并与我们自己的示例程序进行比较的示例程序,一个适当实现的MVC将更好地解决这个问题。这样我们可以互相学习。您永远不应该使用
getGraphics
,它只不过是上次绘制内容的快照,在下次绘制组件(尝试调整窗口大小)或出于任何原因重新绘制组件时将被清除/丢失。Swing使用被动渲染方法,因此“绘制”可以在任何时候发生,Swing有一个良好的文档记录和规定的方法来处理它。再仔细看一看,除非设置了一组类变量,否则无法将变量传递到PAINTCOMPONENT()。这意味着您将得到一个大而混乱的绘制方法,而另一个混乱的类变量用于指定绘制组件的绘制方式。停止永久化REPAINT()适用于所有应用程序,因为更多的人会因为不知道REPAINT()以外的任何东西而感到头痛。那么?使用适当的MVC实现和/或定义paintComponent方法可以调用的委托/代理模型。这不是破坏绘画API设计工作原理的借口。您不必在paintComponent方法中进行所有绘制,但它是自定义绘制的起点。Swing的文档绘制得很好
Rectangle rect = "something"
rectangles.add(rect);
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JButton draw = new JButton("Draw");

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(draw);
                frame.setSize(150, 150);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                draw.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        drawARectangle(frame.getGraphics());
                    }
                });
            }
        });
    }

    public void drawARectangle(Graphics g) {
        g.setColor(Color.RED);
        g.fillRect(20, 20, 100, 100);
    }

}
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private boolean drawBox;

        public TestPane() {
            setLayout(new GridBagLayout());
            JButton draw = new JButton("Draw");
            add(draw);
            draw.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    drawBox = !drawBox;
                    repaint();
                }
            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(150, 150);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (drawBox) {
                g.setColor(Color.RED);
                g.fillRect(20, 20, 100, 100);
            }
        }

    }

}