gpt4 book ai didi

java - 我在实例化对象中的标签正在消失

转载 作者:行者123 更新时间:2023-12-01 11:30:12 25 4
gpt4 key购买 nike

***编辑 - 我已经删除了所有不必要的代码(我认为这可能对某人查看我所采取的故障排除步骤有用)

我遇到了一个非常奇怪的问题。我正在实例化一个具有多个 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();
}
}

最佳答案

所以,一系列的问题......

public static String IDlbltxt = "0";
public static int IDlblint = 0;
static boolean DEBUG = true;

public final static JLabel IDlbl = new JLabel( "0" );

static 不是你的 friend 。基本上,当您创建 sizer 的第一个实例时,这些static 变量将被初始化,并且永远不会再次初始化。

组件只能驻留在单个容器中,这意味着每次调用 add(IDlbl); 时,它都会先从当前容器中删除,然后再添加到新容器(或最后一个容器) sizer 的实例)

static 不是跨对象通信的机制,习惯传递引用以及使用 setter 和 getter

您的 sizer 类有一个 main 方法,这不是问题,只是一个混淆点......

在将所有组件添加到窗口后,最后调用 frame.setVisible(true);

Layout

避免使用 null 布局,像素完美布局是现代 UI 设计中的一种幻觉。影响组件个体尺寸的因素太多,您无法控制其中任何一个。 Swing 的设计初衷是与布局管理器一起工作,放弃它们将导致无穷无尽的问题,您将花费越来越多的时间来尝试纠正

因为您选择取消布局管理器,所以更新 UI 时将遇到无穷无尽的问题,因为任何通常有效的技术都可能不起作用或间歇性地起作用。

您可能想通读Code Conventions for the Java TM Programming Language ,这将使人们更容易阅读您的代码,也让您更轻松地阅读其他人

关于java - 我在实例化对象中的标签正在消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470688/

25 4 0