Java 实践组件法

Java 实践组件法,java,nullpointerexception,paintcomponent,Java,Nullpointerexception,Paintcomponent,我想练习组件法。我的程序由两个不同文件中的类(test和paintClass)组成。我想通过使用paintComponent方法在垂直和水平方向上绘制线,将该区域划分为25个正方形。我的构造函数现在只有paintComponent。我知道这不是很有效,但我会添加按钮,标签和其他东西在未来,所以我需要使用这样的程序。当我运行这个程序时,我得到一个nullpointerexception错误。你能帮忙吗 编辑:我将页面更改为g,并在代码中添加了一些行。仍然有相同的错误 import javax.sw

我想练习组件法。我的程序由两个不同文件中的类(test和paintClass)组成。我想通过使用paintComponent方法在垂直和水平方向上绘制线,将该区域划分为25个正方形。我的构造函数现在只有paintComponent。我知道这不是很有效,但我会添加按钮,标签和其他东西在未来,所以我需要使用这样的程序。当我运行这个程序时,我得到一个nullpointerexception错误。你能帮忙吗

编辑:我将页面更改为g,并在代码中添加了一些行。仍然有相同的错误

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);
        }

    }   
}