Java 面向对象图形

Java 面向对象图形,java,swing,graphics,jframe,object-oriented-analysis,Java,Swing,Graphics,Jframe,Object Oriented Analysis,在我的计算机科学课上,我们正在学习Java,我们已经到了学习面向对象以及它如何有用的地步。几天前,我们开始了一个项目,然而,我的老师没有承担基本的面向对象的任务,而是决定挑战我和其他一些人,在没有真正教我们的情况下,立即创建图形 我们的任务是创建一个分子程序,该程序将接受一个整数来创建一个数组,并为数组中的每个可用部分创建一个随机的x和y坐标,以及半径的大小。使用这些变量,将创建一个椭圆形。我的老师还告诉我们,我们应该使用JFrame或JPanel来实现这一点,我选择了JFrame 在下面的代码

在我的计算机科学课上,我们正在学习Java,我们已经到了学习面向对象以及它如何有用的地步。几天前,我们开始了一个项目,然而,我的老师没有承担基本的面向对象的任务,而是决定挑战我和其他一些人,在没有真正教我们的情况下,立即创建图形

我们的任务是创建一个分子程序,该程序将接受一个整数来创建一个数组,并为数组中的每个可用部分创建一个随机的x和y坐标,以及半径的大小。使用这些变量,将创建一个椭圆形。我的老师还告诉我们,我们应该使用JFrame或JPanel来实现这一点,我选择了JFrame

在下面的代码中,你可以看到我在这方面的尝试,以及我被卡住的地方。我已经注释掉了设置不同颜色的部分,因为这对这个案例并不重要

/**
 * Name: Dylan Eisen
 * Date: May 1, 2017
 * Project: Object Oriented
 * Program: Molecules.java
 */

import java.awt.*;
import java.util.*;
import javax.swing.*;
public class Molecules extends JFrame
{
    static Graphics g;
    public Molecules(Graphics g, int x, int y, int size)
    {
        super.paint(g);
    }
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter the number of elements: ");
        int num = in.nextInt();
        int x = 20, y = 20, size = 20;
        object elements[] = new object[num];
        for(int i = 0; i < elements.length; i++)
        {
            x = (int)(Math.random()*1600);
            y = (int)(Math.random()*900);
            size = (int)(Math.random()*100);
            elements[i] = new object(g, x, y, size);
        }
        Molecules f = new Molecules(g, x, y, size);
        f.setSize(1600, 900);
        f.setVisible(true);
        //f.getContentPane().setBackground(Color.BLACK);
        f.setTitle("Molecules Program - Dylan Eisen"); 
    }
}
class object
{
    Graphics g;
    int x, y, size;
    public object(Graphics g, int x, int y, int size)
    {
        this.x = x;
        this.y = y;
        this.size = size;
    }
    void paint(Graphics g)
    {
        //g.setColor(Color.WHITE);
        g.fillOval(x, y, size, size);
    }
}
如果有人能帮助我,但也向我解释我哪里出了问题,以及将来如何解决这个问题,那将是非常有帮助的

如果有人能帮助我,但也向我解释我哪里出了问题,以及将来如何解决这个问题,那将是非常有帮助的

第一个问题是,你似乎不明白绘画是如何在摇摆中实际工作的。绘画有点像黑魔法,好像Swing神奇地调用了绘画方法。这并不太复杂,但我强烈建议大家看一看,更好地理解绘画过程是如何工作的,以及如何与之融合

我的老师还告诉我们,我们应该使用JFrame或JPanel来实现这一点,我选择了JFrame

我建议使用JPanel作为基本组件,您可以在以后将其添加到您想要的任何容器中,这提供了更灵活的解决方案

一般建议您重写JPanel的paintComponent。如果你发现自己凌驾于绘画之上,你可能做错了什么

您可能还会发现JFrame还有其他问题,因为它的绘制过程不是双缓冲的,也可能会受到框架本身中包含的其他组件的干扰

JFrame实际上是JRootPane的容器,它包含contentPane、JMenuBar和glassPane

当您重写JFrame的绘制时,其他组件可以在未通知您的情况下在您的东西上绘制它们可以独立绘制

一般来说,图形上下文是一系列可生成图像的例程的抽象概念。Swing通过绘制方法传递用于绘制窗口的图形上下文,您不应该维护对该上下文的引用,而应该仅在调用绘制方法时使用它。这意味着您的对象类不需要需要需要图形上下文的构造函数,它应该只在绘制方法/周期的上下文中绘制

对象是一个非常非常糟糕的类名称,因为Java定义了它自己的对象类,如果其他所有类都没有指定父类,则默认情况下会扩展该对象类

我也强烈建议你去看看。这将使其他人更容易阅读您的代码,也使其他人更容易阅读您的代码