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