没有东西画出来,错什么地方了?

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;

public class xiana {

int a;
int b;
xiana(Graphics g,int a,int b){
    this.paint(g,a,b);
}
public void paint(Graphics g,int a,int b) {
    g.setColor(Color.black);        
    g.drawLine(this.a, this.b, 90, 80);        
    g.drawLine(this.a, this.b, 80, 90);        
    g.drawLine(this.a, this.b, 70, 80);        
    g.drawLine(this.a, this.b, 80, 70);
}
public static void main(String[] args) {
    Frame f=new Frame();
    f.setTitle("sss");
    f.setSize(400,600);
    f.setVisible(true);
    Graphics g = f.getGraphics();
    new xiana(g,100,100);
}

}

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据你的代码,出现没有画出线段的原因可能有以下几点:

  1. 没有调用paint()方法。你的构造方法xiana(Graphics g,int a,int b)中应该调用paint()方法,而不是this.paint(g,a,b)。这样才会触发绘画行为。
  2. g对象没有正确获取。在main方法中,应该调用f.paint(g)而不是new xiana(g,100,100)。后者只会调用构造方法,而不会调用paint()方法。
  3. 画布f没有显示。你需要在创建Frame对象f后调用f.setVisible(true)显示窗体,否则不会显示任何内容。

修改后的代码如下:

java
import java.awt.Color;  
import java.awt.Frame;  
import java.awt.Graphics;  
public class xiana {  
     int a;  
     int b;  
     xiana(int a,int b){  
         this.a = a;  
         this.b = b;  
     }  
     public void paint(Graphics g) {  
         g.setColor(Color.black);           
         g.drawLine(this.a, this.b, 90, 80);           
         g.drawLine(this.a, this.b, 80, 90);           
         g.drawLine(this.a, this.b, 70, 80);           
         g.drawLine(this.a, this.b, 80, 70);  
     }  
     public static void main(String[] args) {  
         Frame f=new Frame();  
         f.setTitle("sss");  
         f.setSize(400,600);
         f.setVisible(true);  
         Graphics g = f.getGraphics();  
         f.paint(g);  // 调用paint()方法  
     }     
}

修改后的程序应该可以正常显示四条线段。

你的代码存在一个小问题: 类名首字母尽量用大写,public class Xiana ; 还有就是,你是直接调用构造方法,通过构造方法里面调用 内部方法时,你构造函数传入的 a和b没有初始化;所以需要在构造函数中初始化a和b变量,如下所示:

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;

public class Xiana {
    int a;
    int b;

    public Xiana(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public void paint(Graphics g) {
        g.setColor(Color.black);
        g.drawLine(this.a, this.b, 90, 80);
        g.drawLine(this.a, this.b, 80, 90);
        g.drawLine(this.a, this.b, 70, 80);
        g.drawLine(this.a, this.b, 80, 70);
    }

    public static void main(String[] args) {
        Frame f = new Frame();
        f.setTitle("sss");
        f.setSize(400, 600);
        f.setVisible(true);
        Graphics g = f.getGraphics();
        new Xiana(100, 100).paint(g);
    }
}


建议使用paint()函数来绘制图形,因为在构造函数中绘制图形可能会导致无法预期的结果。建议在paint()函数中调用方法repaint()来触发重绘。

不能new xiana
这里的this指向的是新的实例,跟你之前在main里new出来的frame毫无关系
还有,你必须重写paint事件来画图
否则窗体自动刷新的时候,之前画的图就全没了

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7553515
  • 你也可以参考下这篇文章:什么是闭包?在开发项目时什么地方用闭包?
  • 除此之外, 这篇博客: 这些结构体常见知识你都了解了吗?中的 结构体地址传递 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #include<stdio.h>
    struct S
    {
    	int arr[20];
    	char c;
    	char ch[20];
    };
    void print(struct S *set)
    {
    	int i = 0;
    	for (i = 0; i < 10; i++)
    	{
    		printf("%d ", set->arr[i]);
    	}
    	printf("\n");
    	printf("%c\n", set->c);
    	printf("%s\n", set->ch);
    
    }
    int main()
    {
    	struct S s = { {0,1,2,3,4,5,6,7,8,9},'c',"hello,world" };
    	print(&s);
    	return 0;
    }

    由于我们在创建结构体成员时,开辟了若大空间,这样就会导致函数参数压栈。

    当传递第一个结构体对象时,结构体越大,参数压栈的系统开销较大,导致性能就会大大下降

    而当我们进行结构体传参传的是结构体的地址时,我们都应该知道指针在32平台上是4个字节,在64位平台上是8个字节,但无论我们传值还是传址都可以完成结构体传参,所以为了减少内存消耗,防止压栈导致系统开销过大我们传结构体的地址

  • 您还可以看一下 刘城龙老师的异地局域网(虚拟局域网)纯软件组网方法课程中的 异地局域网演示小节, 巩固相关知识点