Java 杰拉贝尔突然变大了

Java 杰拉贝尔突然变大了,java,swing,jpanel,jlabel,Java,Swing,Jpanel,Jlabel,我试图在JavaSwing中创建一个窗口。 首先,我创建了一个JFrame,在它里面我设置了一个: 菜单栏、工具栏、绘图表面(扩展JPanel) 在DrawingSurface中,我重写了方法paintComponent(),因此我可以在面板内动态绘制,问题是我尝试向面板添加两个标签(调用两次公共int registerInput(字符串名称,字符串comp1,字符串comp2)),但只显示一个,我试着打印位置和尺寸。。。为了调试,我发现绘图开始时很好,但经过几次迭代后,第二个标签突然变得太大,

我试图在JavaSwing中创建一个窗口。 首先,我创建了一个JFrame,在它里面我设置了一个:
菜单栏、工具栏、绘图表面(扩展JPanel)
DrawingSurface中,我重写了方法paintComponent(),因此我可以在面板内动态绘制,问题是我尝试向面板添加两个标签(调用两次公共int registerInput(字符串名称,字符串comp1,字符串comp2)),但只显示一个,我试着打印位置和尺寸。。。为了调试,我发现绘图开始时很好,但经过几次迭代后,第二个标签突然变得太大,我想这就是为什么它没有显示出来的原因。
以下是DrawingSurface类:

import java.awt.Dimension;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;




public class DrawingSurface extends JPanel{

    class DrawingObjects {
        public String name;
        public String comp1;
        public String comp2;
        float totalTcd;
        float totalTpd;
        int numberOfChanges;
        JLabel label;
        float surfaceY;
        float surfaceX;
    }
    private final int WidthFactor = 10;
    private final int HeightFactor = 5;
    private ArrayList<DrawingObjects> drawingObjects = new ArrayList<DrawingObjects>();

    DrawingSurface(){}
    public int registerInput(String name,String comp1,String comp2) {
        for(DrawingObjects dO :drawingObjects){
            if (dO.name.equals(name)){
                System.out.println("Object already exist in Drawing surface");
                return -1;
            }
        }
        DrawingObjects newObj = new DrawingObjects();
        newObj.name = name;
        newObj.comp1 = comp1;
        newObj.comp2 = comp2;
        //newObj.totalTcd = (float) tree.tcdComputing(tree.vertexes.get(comp1));
        //newObj.totalTpd = (float) tree.tpdComputing(tree.vertexes.get(comp1));
        newObj.numberOfChanges = 0;
        newObj.label = new JLabel(newObj.name,SwingConstants.CENTER);
        newObj.label.setBorder(BorderFactory.createTitledBorder(""));

        int tmpWidth = (int) (getSize().getWidth()/WidthFactor);
        int tmpHeight = (int) (getSize().getHeight()/HeightFactor);
        newObj.label.setSize(tmpWidth,tmpHeight);
        System.out.println("Label "+(getSize().getWidth()/WidthFactor)+ " , "+(getSize().getHeight()/HeightFactor));
        System.out.println("Surface Height width "+getSize().getHeight()+" , "+getSize().getWidth());
        newObj.label.setMinimumSize(new Dimension(tmpWidth, tmpHeight));
        newObj.label.setMaximumSize(new Dimension(tmpWidth, tmpHeight));
        drawingObjects.add(newObj);
        add(newObj.label);
        return 0;
    }
    public void unregisterInput(String name) {
        for(DrawingObjects dO :drawingObjects){
            if (dO.name.equals(name))
                drawingObjects.remove(dO);
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawObjLabels(g);
        drawObjWaves(g);
    }
    private void drawObjLabels(Graphics g){
        int index=0;
        for (DrawingObjects dO:drawingObjects){
            dO.label.setLocation(1, (int)(dO.label.getHeight() * index+1));
            System.out.println("Location x y : "+1+" , "+(dO.label.getHeight() * index+1));
            System.out.println("Label "+dO.label.getWidth()+" , "+dO.label.getHeight());
            System.out.println("Surface Height width "+getSize().getHeight()+" , "+getSize().getWidth());

            index++;
        }
    }
    private void drawObjWaves(Graphics g){

    }
}
下面是一个简单的主测试:

public class Tester {

    public static void main(String[] args) {

        WaveDrawer wd = new WaveDrawer();
        wd.registerInput("aaa", "aaaa", "aaa");
        wd.registerInput("aaa2", "aaaa2", "aaa2");
        wd.registerInput("aaa3", "aaaa2", "aaa2");
        wd.registerInput("aaa4", "aaaa2", "aaa2");
    }

}
以下是控制台的输出(我的打印):

请注意,第二个标签的位置和大小突然改变:

Location x y : 1 , 312
Label 1198 , 311

这里的问题是什么?

一个问题是问题不包含问题的最小可运行代码示例。您似乎正在通过
drawObjLabels(…)
方法从paintComponent方法添加和删除GUI组件,这是不应该做的。
paintComponent
方法应该只绘制和绘制,不应该更改GUI的组件结构或状态。我想知道您的标签是否应该是逻辑结构而不是GUI结构——对于给定的代码很难说,我支持@GilbertLeBlanc的请求,即您创建并发布一个@Hovercraft Full Of EEL我编辑了代码并删除了在paintcomponent中添加和删除元素的部分。您使用此代码的总体目标是什么?你想做什么?听起来既有趣又复杂——真幸运!我再次怀疑您是否应该避免为此使用JLabel,而是应该首先计算出非GUI模型,然后创建一个“视图”或GUI类,在单个JPanel中绘制电路模型的可视化表示,然后允许电路动画。
Label 119.0 , 56.6
Surface Height width 283.0 , 1190.0
Label 119.0 , 56.6
Surface Height width 283.0 , 1190.0
Location x y : 1 , 1
Label 119 , 56
Surface Height width 283.0 , 1190.0
Location x y : 1 , 57
Label 119 , 56
Surface Height width 283.0 , 1190.0
Location x y : 1 , 1
Label 119 , 56
Surface Height width 313.0 , 1200.0
Location x y : 1 , 312
Label 1198 , 311
Surface Height width 313.0 , 1200.0  
Location x y : 1 , 312
Label 1198 , 311