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