Java 程序调用时未绘制GUI

Java 程序调用时未绘制GUI,java,swing,user-interface,paint,Java,Swing,User Interface,Paint,我是一名试图自学GUI基础知识的高中生。我试图编写的程序将从用户那里获取两个数字,然后将这两个数字绘制成一个图表。如果用户愿意,还可以输入更多点。我遇到的问题是,当我按下按钮打开应该是图形的GUI时,GUI会出现,但它是空白的。我认为绘制方法以及设置和调用的方式存在问题,但我不确定。提前感谢您的任何建议或帮助 这是创建图形GUI的类: package dataGraph; import javax.swing.*; import java.awt.*; import javax.swing.JF

我是一名试图自学GUI基础知识的高中生。我试图编写的程序将从用户那里获取两个数字,然后将这两个数字绘制成一个图表。如果用户愿意,还可以输入更多点。我遇到的问题是,当我按下按钮打开应该是图形的GUI时,GUI会出现,但它是空白的。我认为绘制方法以及设置和调用的方式存在问题,但我不确定。提前感谢您的任何建议或帮助

这是创建图形GUI的类:

package dataGraph;
import javax.swing.*;
import java.awt.*;
import javax.swing.JFrame;

import java.awt.Graphics;
import java.awt.Graphics2D;

public class graphGUI extends JFrame {
//public Graphics2D g2;
public graphGUI() {
    setTitle("Data Graph");
    setSize(500, 500);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setVisible(true);
}

public void paint(Graphics g) {
    super.paintComponents(g);
    g.drawLine(40, 425, 450, 425);
    g.drawLine(40, 425, 40, 70);
    g.drawString("Graph", 20, 20);
    // g2.draw
    g.drawLine(50, 50, 50, 50);
     for(int i = 0; i < dataEntryGUI.x.size(); i++){
     g.drawOval(Integer.parseInt(dataEntryGUI.x.get(i)),
     Integer.parseInt(dataEntryGUI.y.get(i)),5,5);
     }
}

}
通常,无论何时重写一个方法,都应该对要重写的方法名调用“super”,而不是其他方法。在这种情况下,您将调用:

super.paint(g);
但是,对于自定义绘制,不应重写JFrame的paint()方法

相反,您应该重写JPanel的
paintComponent(…)
方法,然后将面板添加到框架中。有关更多信息和示例,请阅读上Swing教程的部分

我是一名试图自学GUI基础知识的高中生

保留一个指向Swing教程目录的链接,以备将来参考,因为本教程涵盖了基础知识和更多内容

通常,无论何时重写一个方法,都应该对要重写的方法名调用“super”,而不是其他方法。在这种情况下,您将调用:

super.paint(g);
但是,对于自定义绘制,不应重写JFrame的paint()方法

相反,您应该重写JPanel的
paintComponent(…)
方法,然后将面板添加到框架中。有关更多信息和示例,请阅读上Swing教程的部分

我是一名试图自学GUI基础知识的高中生

保留一个指向Swing教程目录的链接,以备将来参考,因为本教程涵盖了基础知识和更多内容

通常,无论何时重写一个方法,都应该对要重写的方法名调用“super”,而不是其他方法。在这种情况下,您将调用:

super.paint(g);
但是,对于自定义绘制,不应重写JFrame的paint()方法

相反,您应该重写JPanel的
paintComponent(…)
方法,然后将面板添加到框架中。有关更多信息和示例,请阅读上Swing教程的部分

我是一名试图自学GUI基础知识的高中生

保留一个指向Swing教程目录的链接,以备将来参考,因为本教程涵盖了基础知识和更多内容

通常,无论何时重写一个方法,都应该对要重写的方法名调用“super”,而不是其他方法。在这种情况下,您将调用:

super.paint(g);
但是,对于自定义绘制,不应重写JFrame的paint()方法

相反,您应该重写JPanel的
paintComponent(…)
方法,然后将面板添加到框架中。有关更多信息和示例,请阅读上Swing教程的部分

我是一名试图自学GUI基础知识的高中生


保留一个指向Swing教程目录的链接,以备将来参考,因为该教程涵盖了基础知识和更多内容。

正如camickr所提到的,应该进行一些重构。也许这会有所帮助

首先,您正在尝试重新绘制JFrame。不建议这样做。您要做的是定义一个要处理的JPanel并将其添加到框架的窗格内容中

我对您的代码进行了一些重构,因此GraphGUI现在是一个JPanel,而不是一个JFrame。这样,您就可以在将来可能创建的任何JFrame中将其用作组件

其次,我在DataEntryGUI中定义了一个函数,用于创建一个新的框架,该框架将保存图形组件并绘制它。以下是完整的代码:


类图形界面


包数据图;
导入javax.swing.*;
导入java.awt.*;
导入java.awt.Graphics;
公共类graphGUI扩展了JPanel{
公共图形库(){
挫折地面(颜色:白色);
}
@凌驾
公共组件(图形g){
超级组件(g);
g、 抽绳(40425450425);
g、 抽绳(40,425,40,70);
g、 拉丝(“图”,20,20);
g、 抽绳(50,50,50,50);
对于(int i=0;i

DataEntryGUI


包数据图;
导入java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
公共类DataEntryGUI扩展JFrame实现ActionListener{
publicstaticarraylistx;//这应该由
publicstaticarraylisty;//操作封装和
//脱钩是另一回事。
专用按钮btnAdd;
专用按钮;
自有品牌lbl;
自有品牌lbl2;
私有文本域xInt;
私有文本字段yInt;
公共数据入口GUI(){
setTitle(“数据输入”);
设置大小(250250);
setDefaultCloseOperation(关闭时退出);
可设置大小(假);
lbl=新标签(“x”);
lbl2=新标签(“y”);
//文本字段
xInt=新文本字段();
yInt=新文本字段();
x=新的ArrayList();
y=新的ArrayList();
//添加按钮
btnAdd=新按钮(“添加另一个”);
//btnAdd.setPreferredSize(新尺寸(70,30));
btnAdd.addActionListener(此);
btnGraph=新按钮(“生成图形”);
btnGraph.addActionListener(此);
添加(lbl);
添加(xInt);
添加(lbl2);
package dataGraph;

import javax.swing.*;
import java.awt.*;

import java.awt.Graphics;

public class graphGUI extends JPanel {

    public GraphGUI() {

        setBackground(Color.WHITE);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawLine(40, 425, 450, 425);
        g.drawLine(40, 425, 40, 70);
        g.drawString("Graph", 20, 20);
        g.drawLine(50, 50, 50, 50);

        for(int i = 0; i < dataEntryGUI.x.size(); i++){
            g.drawOval(Integer.parseInt(dataEntryGUI.x.get(i)),
                    Integer.parseInt(dataEntryGUI.y.get(i)),5,5);
        }
    }
}
package dataGraph;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JFrame;

public class DataEntryGUI extends JFrame implements ActionListener {

    public static ArrayList<String> x;  //This should be figured out by
    public static ArrayList<String> y;  //the OP. Encapsulation and
                                        //decoupling is a different matter.

    private Button btnAdd;
    private Button btnGraph;
    private Label lbl;
    private Label lbl2;
    private TextField xInt;
    private TextField yInt;


    public DataEntryGUI() {
        setTitle("Data entry");
        setSize(250, 250);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);
        lbl = new Label("x");

        lbl2 = new Label("y");

        // text fields
        xInt = new TextField();

        yInt = new TextField();
        x = new ArrayList<String>();
        y = new ArrayList<String>();

        // add button
        btnAdd = new Button("Add another");
        // btnAdd.setPreferredSize(new Dimension(70,30));
        btnAdd.addActionListener(this);
        btnGraph = new Button("Make Graph");
        btnGraph.addActionListener(this);
        add(lbl);
        add(xInt);
        add(lbl2);
        add(yInt);
        add(btnAdd);
        add(btnGraph);
        setLayout(new FlowLayout());
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {

        // System.out.println("boogers");

        if (e.getSource() == btnAdd) {
            //xInt.getText();

            x.add(xInt.getText());
            y.add(yInt.getText());
            xInt.setText("");
            yInt.setText("");

        } else {
            paintGraph();
        }
    }

    private void paintGraph() {
        JFrame graphFrame = new JFrame();
        GraphGUI graph = new GraphGUI();
        graphFrame.getContentPane().add(graph);

        graphFrame.setTitle("Data Graph");
        graphFrame.setSize(500, 500);
        graphFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        graphFrame.setResizable(false);
        graphFrame.setVisible(true);

    }

}