java 中的 paint() 没有显示
paint() in java with no display
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
class game extends JFrame {
public game(){ //this is constructor
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(500,500);
frame.setTitle("Hello world");
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g;
Line2D line = new Line2D.Double(60,90,150,100);
g2.draw(line);
}
public static void main(String args[]) {
game l = new game();
}
}
以上代码在 java 中编译,但在 运行 代码中它只显示框架及其标题,但不包括使用 Graphics2D 和 Line2D 绘制的任何线条,犯了什么错误???正在显示的框架没有显示任何内容,这是为什么???
首先,您正在创建并显示一个 JFrame
,它不是 game
的实例,因此它不可能绘制您在 paint
方法中拥有的内容game
.
你通常不想创建JFrame
的子class来自定义绘画,只需创建JPanel
的子class,然后设置它作为框架的内容窗格。
也不要覆盖paint
,而是覆盖paintComponent
,这是负责绘制当前组件的方法。
您还应该调用 paintComponent
的父方法,以确保正确执行所有常规清理。
同样按照惯例,class 名称应以大写字母开头。
最后一件事,只有在添加了所有组件后才使框架可见,否则有一天您可能会遇到视觉故障。
把它们放在一起 :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Game extends JPanel {
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
Line2D line = new Line2D.Double(60, 90, 150, 100);
g2.draw(line);
}
public static void main(final String args[]) {
Game l = new Game();
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setTitle("Hello world");
frame.setContentPane(l);
frame.setVisible(true);
}
}
在 JFrame
class 的构造函数调用方法中使用此关键字,因为您在 class.
中扩展了 JFrame
class
public game(){ //this is constructor
/*JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(500,500);
frame.setTitle("Hello world");*/
this.setVisible(true);
this.setSize(500,500);
this.setTitle("Hello world");
}
这解决了您的问题。
您不需要创建 JFrame 的实例 class ,
修改您的构造函数,如下所示
public game(){ //this is constructor
setVisible(true);
setSize(500,500);
setTitle("Hello world");
}
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
class game extends JFrame {
public game(){ //this is constructor
JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(500,500);
frame.setTitle("Hello world");
}
public void paint(Graphics g){
Graphics2D g2 = (Graphics2D) g;
Line2D line = new Line2D.Double(60,90,150,100);
g2.draw(line);
}
public static void main(String args[]) {
game l = new game();
}
}
以上代码在 java 中编译,但在 运行 代码中它只显示框架及其标题,但不包括使用 Graphics2D 和 Line2D 绘制的任何线条,犯了什么错误???正在显示的框架没有显示任何内容,这是为什么???
首先,您正在创建并显示一个 JFrame
,它不是 game
的实例,因此它不可能绘制您在 paint
方法中拥有的内容game
.
你通常不想创建JFrame
的子class来自定义绘画,只需创建JPanel
的子class,然后设置它作为框架的内容窗格。
也不要覆盖paint
,而是覆盖paintComponent
,这是负责绘制当前组件的方法。
您还应该调用 paintComponent
的父方法,以确保正确执行所有常规清理。
同样按照惯例,class 名称应以大写字母开头。
最后一件事,只有在添加了所有组件后才使框架可见,否则有一天您可能会遇到视觉故障。
把它们放在一起 :
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
class Game extends JPanel {
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
Line2D line = new Line2D.Double(60, 90, 150, 100);
g2.draw(line);
}
public static void main(final String args[]) {
Game l = new Game();
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setTitle("Hello world");
frame.setContentPane(l);
frame.setVisible(true);
}
}
在 JFrame
class 的构造函数调用方法中使用此关键字,因为您在 class.
JFrame
class
public game(){ //this is constructor
/*JFrame frame = new JFrame();
frame.setVisible(true);
frame.setSize(500,500);
frame.setTitle("Hello world");*/
this.setVisible(true);
this.setSize(500,500);
this.setTitle("Hello world");
}
这解决了您的问题。
您不需要创建 JFrame 的实例 class , 修改您的构造函数,如下所示
public game(){ //this is constructor
setVisible(true);
setSize(500,500);
setTitle("Hello world");
}