gpt4 book ai didi

java - JPanel 面向对象图形

转载 作者:行者123 更新时间:2023-12-02 13:12:59 24 4
gpt4 key购买 nike

在我的计算机科学课上,我们正在学习 Java,我们已经在类(class)中学习了面向对象及其用途。几天前,我们开始了一个项目,但是我的老师并没有承担基本的面向对象的任务,而是决定通过立即创建图形来挑战我和其他一些人,而没有真正教我们。

我们的任务是创建一个“分子”程序,该程序接受一个整数来创建一个数组,并为数组中的每个可用部分创建一个随机的 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);
}
}

如果有人可以帮助我,同时向我解释我哪里出了问题,以及将来如何解决这个问题,那将非常有帮助!

最佳答案

If anyone could help me but also explain to me where I am going wrong, and how to fix this in the future, it would be really helpful!

第一个问题是,您似乎不了解在 Swing 中绘画实际上是如何工作的。绘画有点黑魔法,看起来 Swing “神奇地”调用了 paint 方法。它并不太复杂,但我强烈建议您查看 Painting in AWT and SwingPerforming Custom Painting更好地了解绘画过程的工作原理以及如何与之集成。

My teacher also told us that we should do this using either JFrame or JPanel, I chose JFrame.

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

作为一般建议,您应该覆盖 JPanelpaintComponent。如果您发现自己重写了 paint,那么您可能做错了什么。

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

JFrame 实际上是 JRootPane 的容器,其中包含 contentPaneJMenuBar >玻璃 Pane

JFrame Layers

当您覆盖 JFramepaint 时,其他组件可以在不通知您的情况下绘制您的内容(它们可以独立绘制)

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

object 是一个非常非常糟糕的类名,因为 Java 定义了它自己的 Object 类,默认情况下所有其他类都从该类扩展(如果它们不指定父类)

我还强烈建议您查看Code Conventions for the Java Programming Language 。这将使其他人更容易阅读您的代码,也让其他人更容易阅读您的代码

关于java - JPanel 面向对象图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43881024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com