***编辑 - 我删除了所有不必要的代码(我认为有人看到我采取的排除故障的步骤可能会有用)
我有一个非常奇怪的问题。我正在实例化一个具有多个swing对象的对象,但除了最后一个实例之外的所有jlabel都消失了。它们都是相同的,但只有编号最高的数组索引才显示其标签。但他们都应该被看到。我已经确认它们位于正确的位置并且具有正确的尺寸并且设置为可见但我无法弄清楚为什么会发生这种情况。我已经在另一台计算机上运行该程序,它有相同的结果。只有两个班级。这是一个非常简单的程序,但我似乎无法解决这个问题,有些人可以运行此代码并让我知道它是否有效吗?如果没有,有人可以确定问题吗?
import java.io.*;
import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class sizer extends JPanel {
public static int lhval = 10000;
public static int lvval = 10000;
public static int shval = 10000;
public static int svval = 10000;
public static String IDlbltxt = "0";
public static int IDlblint = 0;
static boolean DEBUG = true;
public final static JLabel IDlbl = new JLabel( "0" );
public sizer (int arg) {
setLayout(null);
setSize(91, 88);
setVisible( true );
IDlbltxt = Integer.toString(arg);
IDlblint = arg;
IDlbl.setHorizontalAlignment(SwingConstants.RIGHT);
IDlbl.setLocation( 40 , 30 );
IDlbl.setFont(new Font("Serif", Font.PLAIN, 18));
IDlbl.setText( IDlbltxt );
IDlbl.setVisible(true);
IDlbl.setBorder( BorderFactory.createLineBorder(Color.black, 5) );
IDlbl.setSize( IDlbl.getPreferredSize() );
add( IDlbl );
repaint();
}
public static void main(String[] args) {
final JFrame frame = new JFrame( "sizer - gettin it sized" );
frame.setLayout(null);
frame.setSize(320, 260);
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
frame.getContentPane().setBackground( Color.red );
final sizer s1 = new sizer(0);
s1.setLocation( 1, 1);
frame.add(s1);
frame.repaint();
}
}
这是第二个文件。
import java.io.*;
import java.lang.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class sizerist extends JPanel {
final static sizer[] sizing = new sizer[21];
public sizerist () {}
public static void main(String[] args) {
final JFrame frame = new JFrame( "sizer - gettin it sized" );
frame.setLayout(null);
frame.setSize(320, 260);
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setVisible( true );
frame.getContentPane().setBackground( Color.red );
for (int i=1; i<6; i++) {
sizing[i] = new sizer(1);
if (i == 1) {
sizing[i].setLocation( 1, 1);
} else {
sizing[i].setLocation( sizing[i-1].getLocation().x, sizing[i-1].getLocation().y + sizing[i-1].getSize().height + 2);
}
frame.add(sizing[i]);
frame.setSize(sizing[i].getSize().width + sizing[i].getLocation().x, sizing[i].getSize().height + sizing[i].getLocation().y + 40);
}
frame.repaint();
}
}
答案 0 :(得分:1)
所以,一系列问题......
public static String IDlbltxt = "0";
public static int IDlblint = 0;
static boolean DEBUG = true;
public final static JLabel IDlbl = new JLabel( "0" );
static
不是你的朋友。基本上,当您创建sizer
的第一个实例时,这些static
变量已初始化,它们永远不会再次初始化。
组件只能驻留在单个容器中,这意味着每次调用add(IDlbl);
时,首先将其从当前容器中删除,然后再添加到新容器(或sizer
的最后一个实例中)
static
不是跨对象通信的机制,可用于传递引用和使用setter和getter
您的sizer
课程采用main
方法,不是问题,只是一个混乱点......
在将所有组件添加到窗口后,最后调用frame.setVisible(true);
。
避免使用null
布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正
因为您已选择取消布局管理器,所以您将无法更新UI的问题,因为任何通常可行的技术,可能无法正常工作或间歇性地工作。
您可能希望阅读Code Conventions for the Java TM Programming Language,这样可以让人们更轻松地阅读您的代码并让您阅读其他代码