【问题标题】:paint() in java with no displayjava中的paint()没有显示
【发布时间】:2018-12-27 09:50:41
【问题描述】:
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绘制的线,这是什么错误? ?正在显示的框架没有显示任何内容,这是为什么呢???

【问题讨论】:

  • 顺便说一句,paint() 在哪里??

标签: java swing jframe paint graphics2d


【解决方案1】:

首先,您正在创建并显示一个JFrame,它不是game 的实例,因此它不可能描绘您在gamepaint 方法中拥有的内容。

你通常不想为自定义绘画创建JFrame的子类,只需创建JPanel的子类,并将其设置为框架的内容窗格。

同样不要覆盖paint,而是paintComponent,这是负责绘制当前组件的方法。

您还应该调用paintComponent 的父方法,以确保所有常规清理都正确进行。

同样按照惯例,类名应该以大写字母开头。

最后一件事,只有在添加完所有组件后才使框架可见,否则有一天您可能会遇到视觉故障。

把它们放在一起:

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

    }

}

【讨论】:

    【解决方案2】:

    JFrame 类的构造函数调用方法中使用 this 关键字,因为您在类中扩展了 JFrame 类。

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

    这解决了你的问题。

    【讨论】:

      【解决方案3】:

      您不需要创建 JFrame 类的实例, 修改你的构造函数,如下所示

      public game(){   //this is constructor
         setVisible(true);
         setSize(500,500);
         setTitle("Hello world");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 2012-10-28
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多