Java 实践组件法
我想练习组件法。我的程序由两个不同文件中的类(test和paintClass)组成。我想通过使用paintComponent方法在垂直和水平方向上绘制线,将该区域划分为25个正方形。我的构造函数现在只有paintComponent。我知道这不是很有效,但我会添加按钮,标签和其他东西在未来,所以我需要使用这样的程序。当我运行这个程序时,我得到一个nullpointerexception错误。你能帮忙吗 编辑:我将页面更改为g,并在代码中添加了一些行。仍然有相同的错误Java 实践组件法,java,nullpointerexception,paintcomponent,Java,Nullpointerexception,Paintcomponent,我想练习组件法。我的程序由两个不同文件中的类(test和paintClass)组成。我想通过使用paintComponent方法在垂直和水平方向上绘制线,将该区域划分为25个正方形。我的构造函数现在只有paintComponent。我知道这不是很有效,但我会添加按钮,标签和其他东西在未来,所以我需要使用这样的程序。当我运行这个程序时,我得到一个nullpointerexception错误。你能帮忙吗 编辑:我将页面更改为g,并在代码中添加了一些行。仍然有相同的错误 import javax.sw
import javax.swing.*;
import java.awt.*;
public class test
{
public static void main(String[] args)
{
JFrame frame = new JFrame("buttons");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
paintClass paint = new paintClass();//This line has error.
paint.repaint();//ADDED
frame.add(paint);
frame.pack();
frame.setVisible(true);
}
}
import javax.swing.*;
import java.awt.*;
public class paintClass extends JPanel
{
private Graphics g;
private int interval,side,number;
public paintClass()
{
this.repaint();//ADDED
paintComponent(g);//This line has error.
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);//ADDED and has an error.
this.repaint();//ADDED
side = 250;
number = 5;
interval = side / number;
g.drawRect(0,0, side, side);
for(int i = 0; i <= number - 1; i++)
{
for(int j = 0; j <= number - 1; j++)
{
g.drawLine(i * interval, 0, i * interval, side);
}
g.drawLine(0, i * interval, side, i * interval);
}
}
}
import javax.swing.*;
导入java.awt.*;
公开课考试
{
公共静态void main(字符串[]args)
{
JFrame=新的JFrame(“按钮”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
paintClass paint=new paintClass();//此行有错误。
paint.repaint();//已添加
框架。添加(油漆);
frame.pack();
frame.setVisible(true);
}
}
导入javax.swing.*;
导入java.awt.*;
公共类paintClass扩展了JPanel
{
私有图形g;
专用整数间隔、边、数;
公共绘画课()
{
this.repaint();//已添加
paintComponent(g);//此行有错误。
}
公共组件(图形g)
{
super.paintComponent(g);//已添加,但有错误。
this.repaint();//已添加
侧面=250;
数字=5;
间隔=边/数;
g、 drawRect(0,0,侧面,侧面);
对于类“paintClass”中的(inti=0;i),应实例化页面变量:
public paintClass()
{
page = new Graphics();
paintComponent(page);
}
您正在使用尚未实例化的图形对象在paintClass的构造函数中调用paintComponent。对于简单绘图,您不需要直接调用此方法-必要时EDT(使用适当的图形对象)将调用此方法(换句话说,删除该行,不要保留对图形对象的引用)
您可以通过调用JComponent(JPanel的父类)定义的repaint()方法来请求重新绘制
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
//do your custom drawing here, and never call repaint from this method
}
如果您还没有学习Oracle关于自定义绘制的教程,我建议您:您需要覆盖paintComponent(Graphics g)
而不是创建一个。另外,如果您希望执行paintComponent(…)
,请调用repaint()
在该组件上,不要直接调用paintComponent(…)
。在Swing中绘制的第一条规则是,您不控制绘制过程。Swing将在需要时绘制。您所能做的最好方法是向系统提供您希望更新的提示
- 永远不要维护对图形或非自己创建的图形的引用
- 不要直接或间接地从任何绘制方法内部调用
repaint
,这将建立一个递归绘制循环,最终将消耗您的CPU
- 在屏幕上无法显示的组件上调用
重新绘制是毫无意义的
比如说
public class paintClass extends JPanel
{
private int interval,side,number;
public paintClass()
{
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
side = 250;
number = 5;
interval = side / number;
g.drawRect(0,0, side, side);
for(int i = 0; i <= number - 1; i++)
{
for(int j = 0; j <= number - 1; j++)
{
g.drawLine(i * interval, 0, i * interval, side);
}
g.drawLine(0, i * interval, side, i * interval);
}
}
}
公共类paintClass扩展了JPanel
{
专用整数间隔、边、数;
公共绘画课()
{
}
@凌驾
公共维度getPreferredSize(){
返回新维度(400400);
}
@凌驾
受保护组件(图形g)
{
超级组件(g);
侧面=250;
数字=5;
间隔=边/数;
g、 drawRect(0,0,侧面,侧面);
对于(int i=0;i),它给出以下错误:错误:图形是抽象的;无法实例化图形类是抽象的。应该依赖适当的图形上下文,在这种情况下,EDT调用该方法时传递给paintComponent的上下文。如何使用repaint()方法?@hackerboy要执行paintComponent(…)
您可以执行此操作paint.repaint()
其中paint
是paintClass
的一个实例,也可以调用this.repaint()
在paintClass
的任何方法中。只能猜测您所做的更改。您必须向我们展示代码(例如用所做的更改更新您的问题)我想练习paintComponent方法。
-然后从上的Swing教程中的工作示例开始。该教程将为您的程序显示更好的结构。您需要更改的只是paintComponent()方法中的代码。
public class paintClass extends JPanel
{
private int interval,side,number;
public paintClass()
{
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
side = 250;
number = 5;
interval = side / number;
g.drawRect(0,0, side, side);
for(int i = 0; i <= number - 1; i++)
{
for(int j = 0; j <= number - 1; j++)
{
g.drawLine(i * interval, 0, i * interval, side);
}
g.drawLine(0, i * interval, side, i * interval);
}
}
}