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与博主@晓码自在合作编写:
根据你的代码,出现没有画出线段的原因可能有以下几点:
修改后的代码如下:
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事件来画图
否则窗体自动刷新的时候,之前画的图就全没了
#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个字节,但无论我们传值还是传址都可以完成结构体传参,所以为了减少内存消耗,防止压栈导致系统开销过大我们传结构体的地址