【问题标题】:java paint function doesn't work [closed]java绘画功能不起作用[关闭]
【发布时间】:2014-12-20 01:02:15
【问题描述】:

我正在使用java绘制椭圆并用线条连接它们,当我扫描变量时,绘图功能根本不起作用

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

【问题讨论】:

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

标签: java swing user-interface


【解决方案1】:

Graphics g=m.getGraphics(); 不是 Swing 中自定义绘制的方式,除了能够返回 null 之外,它只是最后绘制的“快照”,可以随时绘制

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

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

先看看

有关在 Swing 中绘画如何工作的更多详细信息。

您应该避免直接绘制到像 JFrame 这样的顶级容器,除了您实际上没有向框架添加任何新功能之外,它们(顶级容器)不是双缓冲的,并且可能会在更新期间导致闪烁和JFrame(和JWindowJApplet)在框架和用户之间有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();
        }

    }

}

【讨论】:

    【解决方案2】:

    您必须重写 JFrame 的绘制方法。除非你这样做,否则它不会画到框架上,阅读这个, Overriding and Hiding Methods

    这是一个演示

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2013-12-11
      • 2011-12-03
      相关资源
      最近更新 更多