【问题标题】:Java JPanel Graphics - Understanding how to draw a simple shapeJava JPanel Graphics - 了解如何绘制简单的形状
【发布时间】:2020-07-08 23:32:36
【问题描述】:

免责声明:我是 Java 新手。我是 Swing 的新手。我敢肯定它会显示出来。

我已经查看了很多关于如何在 jpanel“画布”上绘图的示例/教程。但它们大多具有相同的基本格式,并将它们的所有 drawLine/drawRect/drawArc 放在 paintComponent() 方法中。似乎假设人们想一次将静态的东西绘制到 jpanel 上。但是,如果我想在程序的运行过程中更改 jpanel 对象,比如绘画程序或游戏,该怎么办?

我想我需要能够访问 jpanel 对象和内部方法来绘制。我打赌我正在做的不是最佳实践,但这是我所拥有的:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PaintPanel extends JPanel {
    public static JFrame frame;
    private Graphics g = getGraphics();

    public static void main(String[] args) {
        frame = new JFrame();
        frame.getContentPane().setBackground(new Color(32, 32, 32));
        frame.setResizable(false);
        frame.setBounds(1, 1, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null); // center frame on screen
        
        PaintPanel paintPanel = new PaintPanel();
        paintPanel.setBounds(10, 10, 100, 100);
        paintPanel.setBackground(Color.red);
        frame.add(paintPanel);
    }
    
    // constructor
    public PaintPanel() {

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
    public void DrawRect(Integer x, Integer y, Integer w, Integer h, Color color) {
        g.setColor(color);
        g.fillRect(x, y, w, h);
        this.repaint(); // doesn't seem to do anything
    }
}

此代码导致一个红色面板框,但我的用户方法 DrawRect() 没有绘制任何内容。

  1. 我在某些地方读到有必要重写paintComponent() 方法。如果里面什么都没有,目的是什么?
  2. 如何让我的 DrawRect() 方法工作?

【问题讨论】:

  • 但是,如果我想在程序运行期间更改 jpanel 对象怎么办 - 你保留一个要绘制的对象的 ArrayList。然后在paintComponent() 方法中遍历ArrayList 以绘制所有对象。这使您可以选择从 ArrayList 中动态添加/删除对象。有关此方法的工作示例,请参阅 Custom Painting Approaches
  • 如何让我的 DrawRect() 方法工作? - 1) 方法名称不应以大写字符开头。 2) 将信息添加到存储在 ArrayList 中的自定义对象中。从上面修改工作示例。
  • camickr 提供的答案正是我需要的推动力。我创建了一个扩展的 JPanel 类并将列表添加到 paintComponent() 功能中,并且它正在工作。谢谢大家。

标签: java swing graphics jpanel drawing


【解决方案1】:

您缺少的部分是 model 对象。应该有一个外部对象来描述应该绘制的内容。例如,在游戏中,它可以描述游戏的当前状态。

您的自定义组件查看此模型并采取必要的步骤来绘制它。这是在您认为适合添加的 paintComponent 和辅助方法中实现的。

要制作动画,您需要创建一个随时间修改模型的循环,并要求自定义组件使用 repaint() 重新绘制自身。

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多