java绘制函数不起作用

java绘制函数不起作用,java,swing,user-interface,Java,Swing,User Interface,我使用java绘制椭圆并通过线连接它们,当我扫描变量时,paint函数根本不起作用 import java.awt.Color; import javax.swing.JFrame; import java.awt.Graphics; import java.awt.Paint; import java.util.Random; import java.util.Scanner; import javax.swing.JOptionPane; public class Main extends

我使用java绘制椭圆并通过线连接它们,当我扫描变量时,paint函数根本不起作用

import java.awt.Color;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Paint;
import java.util.Random;
import java.util.Scanner;
import javax.swing.JOptionPane;

public class Main extends JFrame {
    public Main (){
        setTitle("Graph");
        setSize(1000, 1000);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public   void paint (Graphics g,int x,int z,int y) {
        g.fillOval(x, x+20, 40, 40);
        g.drawLine(x+10, x+50,x+z+10, z+30);
        g.fillOval(x+z, z, 40, 40);
    }

    public static void main(String[] args) {
        Scanner scan=new Scanner(System.in);
        int x = scan.nextInt();
        int z =scan.nextInt();
        int y =scan.nextInt();

        x=x+1;
        z=z+1;
        y=y+1; 

        Main m=new Main();
        Graphics g=m.getGraphics();
        m.paint(g, x, z, y);
    }
}

必须重写JFrame的绘制方法。除非你这样做,否则它不会在画框上作画,

这是一个演示

public class Main extends JFrame {

    int x;
    int y;
    int z;

    public Main(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
        setTitle("Graph");

        setSize(1000, 1000);

        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    @Override
    public void paint(Graphics g) {

        g.fillOval(x, x + 20, 40, 40);

        g.drawLine(x + 10, x + 50, x + z + 10, z + 30);

        g.fillOval(x + z, z, 40, 40);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int x = scan.nextInt();
        int z = scan.nextInt();
        int y = scan.nextInt();
        x = x + 1;
        z = z + 1;
        y = y + 1;
        Main m = new Main(x, y, z);

    }
}
图形g=m.getGraphics;这并不是定制绘画是如何在Swing中完成的,除了能够返回null之外,它只是上一次绘画的快照,可以在任何时候进行绘制

public void paint Graphics g,int x,int z,int y{不是在绘制过程中调用的方法。Java并没有神奇地知道这个方法可以用于绘制,您需要告诉它

此外,您不应该将基于控制台的输入与GUI混合,选择其中一个

首先看一看

有关Swing中绘画工作方式的更多详细信息

您应该避免直接绘制到顶级容器(如JFrame),除了您实际上没有向框架添加任何新功能之外,它们不是双缓冲的顶级容器,并且在更新过程中可能会导致闪烁,JFrame、JWindow和JApplet具有JRootPane和内容窗格,有时还可以使用玻璃窗格在框架和用户之间,这可能会导致任何数量的绘画问题

更好的解决方案是基于类似JPanel的内容创建自定义组件,并覆盖其paintComponent,确保在执行任何自定义绘制之前调用super.paintComponent

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Main101 {

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

    public Main101() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private int x = 10;
        private int z = 10;

        public TestPane() {
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.fillOval(x, x + 20, 40, 40);

            g2d.drawLine(x + 10, x + 50, x + z + 10, z + 30);

            g2d.fillOval(x + z, z, 40, 40);
            g2d.dispose();
        }

    }

}

下次请花点时间选择合适的标题和正确的代码格式。好的,我会的,这是我第一次,它怎么不工作?它做什么?你为什么给我们看这么多代码?只给我们一个我第一次的答案抱歉,如果你知道我如何工作,请告诉我好的,我会的,这是我第一次,不客气!下一步t时间请按照建议阅读MCVE。