不确定如何使用Swing绘制矩形。

3
我正在练习一次即将到来的考试,并查看一些练习题。我遇到了一个比其他题目更具挑战性的问题。我需要编写一个方法,使用swing来创建100个矩形,其宽度相同但高度不同,这可以通过简单的数学计算得出。我已经创建了一个数组来保存每个矩形的高度,并设置了宽度。我该如何使用swing来创建这些矩形?我希望你能在回答我的问题时引导我(例如尝试使用JLabel或类似的东西),而不是直接为我完成。否则我怎么会学得会呢?可能还会有一些后续问题。下面是生成高度数组和设置宽度的代码。假定参数单位为像素,请保留HTML标记。
public void paintComponent() {
   int[] heights = new int[100];
   int width = 10
   int initialHeight = 100;
   for (int i=0; i<100; i++) {
      int usedHeight = height - i;
      heights[i] = usedHeight;
   }

请不要为我完成此操作。我只需要指向正确的方向。我认为我会以某种方式使用swing来完成这个任务。


哪一部分让你感到困扰?使用Swing绘制矩形的信息并不应该太难找到。 - Anthony Grist
你在摆动路线上走了多远?是遇到了空白需要填充,还是打开摆动窗口也有困难? - Richard Tingle
在Swing中,我们已经学习了JFrame、JPanel、JLabel、布局、按钮和菜单。我可以创建所有这些组件,但是在使用Swing实际创建和绘制矩形时遇到了困难。 - Cody Berry
我建议您为每个矩形创建一个BufferedImage,并将它们保存在数组中,在每次刷新/重绘时清除面板并重新绘制图像,或者只需使用JLabel显示它们。对于绘图,从生成的BufferedImage创建一个Graphic对象,并调用绘制/填充矩形方法 :) - user2511414
1
@CodyBerry 它基本上是以笛卡尔坐标系为基础,其中0,0是JFrame左上角。要使用drawRect(x,y,width,height)(请参见javadocs)绘制矩形,当您递增X时,矩形的左上角将向右移动。但是,递增Y会使其向下移动。你是指这样吗? - Clark Kent
3个回答

3
基本上,你需要创建一个继承自 JComponent 并重写 paintComponent 方法的子类。传递给它的 Graphics 对象可以让你实现所需的功能(请看示例)。

1
哦,哇,我完全忽略了JComponent。我们的作业从未使用过这个类,所以它从未在我的脑海中出现过。简单的事情往往被轻易地忽视。这应该足够让我开始了。谢谢! - Cody Berry
1
@CodyBerry:对于这种绘制,请考虑使用JPanel而不是JComponent,因为两者之间存在微妙的差异,正如在此答案中所引用的那样。感谢你的提示,我会等待今天的限制结束后再进行操作。+1 - nIcE cOw
1
@nIcEcOw,你发现得不错,但在重写的paintComponent方法中,首先调用super.paintComponent(graphics)就足够了。 - gustafc
@gustafc:是的,我不反对这种方法,只是提供一点额外的信息。几天前我发现了这个,以前从未深入研究过JComponent的Java文档。但是确实,JComponent已经足够了 :-) - nIcE cOw

2

一般方法:

  • 创建一个带有JPanel的JFrame

  • 给它一个布局(像GridLayout这样的简单布局可能适用于此)

  • 将组件添加到您的容器中(我会向您指向Rectangle)(或者您可以只使用JPanels并设置其边框/填充颜色)

Swing中最难学习的是布局管理器,因此请准备花费一些时间来解决问题。 准备让swing将所有矩形绘制在彼此之上,在单个列中绘制它们,或者根本不绘制它们。 可能不是按照这个顺序。


1
矩形不是Swing组件。矩形保存矩形的值(x原点,y原点,宽度,高度)。 - Gilbert Le Blanc
你是正确的,矩形是awt。Swing 的做法是重写 paintComponent,就像采纳的答案中所示,或者简单地使用带边框的 JPanels。 - roippi

1

好的,首先,假设高度正在减少,你当前的代码存在一些错误:

public void paintComponent() {
  int[] heights = new int[100];
  int width = 10;
  int initialHeight = 100;
  for (int i=0; i<100; i++) {
    heights[i] = initialHeight;
    initialHeight--;
    //also heights[i] = 100-i;
  }
}

usedHeight在循环内被声明时,它只存在于循环的一个“周期”中。
其次,如果你想了解swing的工作原理,请下载5个以上已经工作的示例,并从代码中弄清楚(对我来说效果很好)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接