Java 实现图形 g?

Java implementing graphics g?

第一个Java项目所以这个问题可能很业余。 我正在尝试 运行 方法 paintComponent 在 class 中绘制形状,它扩展了 JFRAME 我只是不知道如何调用它。我是否需要创建一个图形变量作为背景,以便调用 paintComponent(background)? 或者也许是一个新的 Planel?

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.Graphics.*;
import java.awt.event.*;
import java.text.*;
public class Pythag extends JFrame implements ActionListener
{

JTextField text1,text2;
JLabel label1,label2,label3;
JButton buttonC;
public Pythag(){
    super ("Pythagorean Theorem");
    // Set up the frame
    this.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    this.setBounds (300, 300, 200, 350);
    //creating objects
    JPanel boxY = new JPanel ();
    boxY.setLayout(new BoxLayout(boxY,BoxLayout.Y_AXIS));
    label1 = new JLabel ("A side length",JLabel.CENTER);
    label2 = new JLabel ("B side length",JLabel.CENTER);
    label3 = new JLabel ("Type in side lengths to calculate hypotenuse",JLabel.CENTER);
    buttonC = new JButton ("Button1");
    text1 = new JTextField (10);
    text2 = new JTextField (10);

    //Nestled flow layouts:
    //layout1
    JPanel line = new JPanel();
    line.add(label1);
    line.add(text1);
    boxY.add(line);

    //layout2
    JPanel line2 = new JPanel();
    line2.add(label2);
    line2.add(text2);
    boxY.add(line2);
    //layout 3

    JPanel line3 = new JPanel();
    line3.add(label3);
    boxY.add(line3);
    //layout 4

    JPanel line4 = new JPanel();
    line4.add(buttonC);
    boxY.add(line4);
    //Adding listeners
    buttonC.addActionListener (this);
    text1.addActionListener (this);        
    text2.addActionListener (this);        

    //Setting up
    this.setContentPane (boxY);
    this.setVisible (true);
    this.setSize(450,200);
    // this.add(panel);
    //  Graphics bg = backbuffer.getGraphics();

}

public void actionPerformed (ActionEvent e)
{
    if (e.getSource () == buttonC)
    { 
        calculate();

    }

}

public void calculate(){
    double a,b;
    DecimalFormat Formatter = new DecimalFormat("#0.00");
    try
    {
        a = Double.parseDouble (text1.getText());
        b = Double.parseDouble (text2.getText());
        double hypot=Math.sqrt(a*a + b*b);
        label3.setText("The length of the hypotenuse is: " + Formatter.format(hypot));
    }
    catch (NumberFormatException ex)
    {

        label3.setText("You're clearly a confused, please use NUMBERS for side lengths.");

    }

}
public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.fillRect(100,100,20,20);

}


public static void main (String[] args)
{
    new Pythag ();

} // main method
} 

如果您确实想覆盖 paint(),则仅覆盖顶级容器,请参阅 this 以获得更完整的解释。不过,"cleanest" 方法是创建一个新的 class,它扩展 JPanel 并覆盖 paintComponent()。如果你想在运行时重新绘制面板,你可以调用repaint()。这是一个例子:

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.Graphics.*;
import java.awt.event.*;
import java.text.*;
import java.util.Random;

public class Pythag {

    public Pythag() {

        JFrame frame = new JFrame("JFrame");

        frame.setContentPane(new MyPanel());

        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);

    }

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Pythag();
            }
        });

    }

    public class MyPanel extends JPanel {

        int x;
        int y;

        public MyPanel() {

            ActionListener al = new ActionListener() {
                Random r = new Random();

                @Override
                public void actionPerformed(ActionEvent e) {

                    x = r.nextInt(getWidth()); // Random x-coordinate
                    y = r.nextInt(getHeight()); // Random y-coordinate
                    repaint(); // Repaints the panel

                }
            };

            Timer timer = new Timer(500, al); // Runs ever 500 milliseconds.
            timer.start();

        }

        @Override
        public void paintComponent(Graphics g) {

            super.paintComponent(g); // Removes previous drawings

            g.setColor(Color.RED);
            g.fillRect(x, y, 10, 10);

        }

    }

}