java - 如何让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 表单设计器文件。
解决方案
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,以便稍后确定用户单击的圆圈。查看:拖动绘制的形状以获得完整示例,展示如何在面板周围单击和拖动形状。
推荐阅读
- flutter - Flutter - 底部被 Infinity 像素溢出
- mysql - 如何在linux中编写正确的dsn
- c# - 不支持直通,禁用 GL,使用 ANGLE
- ajax - 在ajax中将模型发布到控制器
- firebase - 没有为“对象”类型定义吸气剂“长度”。// 运算符 '[]' 没有为类型 'Object' 定义
- node.js - 如何提高节点服务器的安全性
- javascript - 在异步 http 请求中,每个请求的持续时间未正确显示
- webpack - Webpack 找不到 dist/style.css
- parsing - 使用 PEG.js 实现带有修剪缩进的 heredocs
- javascript - useCallback 与更新的状态对象 - React.js