【问题标题】:Java Swing DrawRect: creating new replaces old dimensionsJava Swing DrawRect:创建新维度替换旧维度
【发布时间】:2020-07-24 23:30:05
【问题描述】:

我尝试使用以下类制作两个矩形:DrawRect,但是当我创建一个新的 DrawRect 对象时,它会替换旧对象的宽度和高度。

package MemDiagramVisualizer;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.*;

public class DrawRect extends JPanel {
   private static int RECT_X;
   private static int RECT_Y;
   private static int RECT_WIDTH;
   private static int RECT_HEIGHT;

   
   public DrawRect(int w, int h) {
       RECT_X = 20;
       RECT_Y = 20;
       RECT_WIDTH = w;
       RECT_HEIGHT = h;
   }
   
   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawRect(RECT_X, RECT_Y, RECT_WIDTH, RECT_HEIGHT);
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(RECT_WIDTH + 2 * RECT_X, RECT_HEIGHT + 2 * RECT_Y);
   }

}
JPanel visDisplay = new JPanel();
visDisplay.setLayout(new GridLayout(1,3));
DrawRect rec2 = new DrawRect(40,60);
visDisplay.add(rec2);
DrawRect rec = new DrawRect(100,600);
visDisplay.add(rec);

上面的代码在添加到框架内容窗格时会创建两个尺寸为 100,600 的矩形

【问题讨论】:

  • 什么是drawrec2?为了获得更好的帮助,请尽快发布正确的minimal reproducible example 来证明问题
  • 它实际上是 DrawRect 的副本,这是我目前解决问题的方法:拥有一个具有相同代码但名称不同的单独类。我编辑了代码以解决我最初的问题
  • 欢迎来到 Stack Overflow。请使用tour,阅读what's on-topic,阅读How to Ask a Good QuestionHow to create a Minimal, Reproducible Example。后者(正如@Frakcool 所指出的)允许其他人重现您的问题,从而更快、更有效地帮助您:帮助他人帮助您

标签: java swing graphics jpanel


【解决方案1】:

您的程序中有几个问题:

  1. 所有这 4 个变量:

    private static int RECT_X;
    private static int RECT_Y;
    private static int RECT_WIDTH;
    private static int RECT_HEIGHT;
    

    它们都是静态的,但是您试图在程序内部更改它们,这将适用于您程序的所有实例,并且它们都将共享值。在这种情况下,我建议你删除它,你应该很好。这就是为什么当您使用相同的代码创建另一个类时它可以工作的原因。

  2. RECT_X = 20;RECT_Y = 20; 在构造函数中,如果它们是常量,则在顶部初始化它们,不要在类的每个实例中设置它们。

  3. 不是错误,但根据您的要求,您可能希望停止使用多个 JPanels,而是使用 in this answer 所示的 Shape API 创建一个可以在单个 @987654328 中绘制的形状数组@。同样,这一切都取决于您的需求。

从上面的那些常量中删除 static 关键字后,我们得到了:

【讨论】:

  • 谢谢,甚至没有注意到它们是静态的。我会研究 ShapeAPI,谢谢你的信息
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 2016-03-19
  • 2017-12-16
相关资源
最近更新 更多