首页 > 解决方案 > 如何让paintComponent 使用我的代码?

问题描述

我已经尝试了多种方法来让它运行。目的是绘制用户可以点击的圆圈。我无法在 JPanel 上绘制任何东西。我最初是在扩展 JFrame,但意识到我需要扩展 JPanel。我正在使用 IntelliJ GUI Designer 进行布局。我将不胜感激任何帮助。

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

public class Main extends JPanel implements Runnable {
    private JPanel jPanel1;
    private JTabbedPane tabbedPane1;
    private JTextField textField1;
    private JButton submitButton;
    private JButton resetButton;
    private JPanel cartPanel;
    private JLabel imageLabel;
    private static Main instance;
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillOval(100,100,500,500);
        g.setColor(Color.YELLOW);
        g.fillOval(10, 10, 200, 200);
        // draw Eyes
        g.setColor(Color.BLACK);
        g.fillOval(55, 65, 30, 30);
        g.fillOval(135, 65, 30, 30);
        // draw Mouth
        g.fillOval(50, 110, 120, 60);
        // adding smile
        g.setColor(Color.YELLOW);
        g.fillRect(50, 110, 120, 30);
        g.fillOval(50, 120, 120, 40);

    }
    public Main(){
        JFrame jf = new JFrame();
        jf.setTitle("Defect Mapping");
        jf.setContentPane(this.jPanel1);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //this.setJMenuBar(jUnitMenuBar());
        ImageIcon img = new ImageIcon("C:\\Users\\jaitken\\IdeaProjects\\ERP\\icon.gif");
        jf.setIconImage(img.getImage());
        jf.pack();
        jf.setSize(1280, 720);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        run();
    }

    public void run(){
        instance = this;
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

    }

}

这是 IntelliJ 表单设计器文件。

https://pastebin.com/Z3b0PVtZ

标签: javaswing

解决方案


jf.setContentPane(this.jPanel1);

“jPanel1` 变量为空。所以该语句什么也不做。

public class Main extends JPanel implements

您的自定义绘画是在“主”类中完成的,但您永远不会创建该类的实例或将面板添加到框架中。

阅读 Swing 教程中关于自定义绘制的部分,以更好地构建代码并进行自定义绘制。我建议您重新开始并从“第 2 步”下载演示代码,以用作代码的起点。

jf.pack();
jf.setSize(1280, 720);
jf.setResizable(false);

调用的重点pack()是添加到框架中的所有组件都以其首选大小显示。正确完成自定义绘画后,您的自定义面板将具有首选尺寸。

调用setSize(...)破坏了调用 pack() 的目的。摆脱声明。

此外,setResizable(...)需要在 pack() 语句之前调用该语句,因为它会改变框架上装饰的大小。

run();

该语句应该是 main() 方法中的第一条语句。必须在创建 Swing 组件之前设置 LAF。

目的是绘制用户可以点击的圆圈

完成基本绘制后,您需要对其进行修复以保留要绘制的形状的 ArrayList,以便稍后确定用户单击的圆圈。查看:拖动绘制的形状以获得完整示例,展示如何在面板周围单击和拖动形状。


推荐阅读