【问题标题】:Having problem updating JLabel texts; relating to GUI Builder of Netbeans 6.9更新 JLabel 文本时遇到问题;与 Netbeans 6.9 的 GUI Builder 相关
【发布时间】:2011-04-21 16:07:02
【问题描述】:

我在下面附加的程序中更新我的 GUI 上的 JLabels 文本时遇到问题。

尽管我已将每个 JLabel 分配给数组中的相应索引,但 lblArray 似乎为空。

我确实尝试通过从 JLabels 中删除静态修饰符以及可能的其他一些相关变量(如 lblArray)来尝试使用静态修饰符,并在 main() 方法中实例化一个 Blackjack 类并从该新对象访问 JLabels。但是生成的界面是喜怒无常的,每次结果都不一样,但基本上是在3种GUI故障之间交替出现,有时可以更新,有时不能。

GUI 是从 NetBeans 6.9 中的 GUI Builder 生成的。

我怀疑与静态修饰符有关。如果是这个问题,请向我解释。此外,请问我们如何在静态和非静态变量或方法之间实际访问,尤其是从静态 main() 方法访问非静态变量?

顺便说一句,我遇到的另一个问题是没有足够的灵活性来修改从 GUI Builder 生成的编码。有没有办法灵活修改编码?

我在这里附上我的编码摘录,因为原始编码可能很长。我已经包含了我认为与此问题相关的任何内容。在 initComponents() 方法中有 GUI Builder 的自动代码生成,我在下面的代码中省略了。

public class Blackjack extends javax.swing.JFrame {

static Deck deck = new Deck(1);
static int numberOfPlayer = 1;
static Player playerArray[];
static int sequence;
static JLabel lblArray[];

/** Creates new form Blackjack */
public Blackjack() {
    initComponents();
}

// Variables declaration - do not modify
private javax.swing.JButton btnHit;
private javax.swing.JButton btnStand;
private javax.swing.JButton btnSurrender;
private static javax.swing.JLabel lblCard1;
private static javax.swing.JLabel lblCard10;
private static javax.swing.JLabel lblCard2;
private static javax.swing.JLabel lblCard3;
private static javax.swing.JLabel lblCard4;
private static javax.swing.JLabel lblCard5;
private static javax.swing.JLabel lblCard6;
private static javax.swing.JLabel lblCard7;
private static javax.swing.JLabel lblCard8;
private static javax.swing.JLabel lblCard9;
private javax.swing.JLabel lblDealer;
private javax.swing.JLabel lblPlayer;
private javax.swing.JLabel lblTitle;
private javax.swing.JPanel pnlDealer;
private javax.swing.JPanel pnlOptions;
javax.swing.JPanel pnlPlayer;
// End of variables declaration

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new Blackjack().setVisible(true);
        }
    });

    lblArray = new JLabel[10];
    lblArray[0] = lblCard1;
    lblArray[1] = lblCard2;
    lblArray[2] = lblCard3;
    lblArray[3] = lblCard4;
    lblArray[4] = lblCard5;
    lblArray[5] = lblCard6;
    lblArray[6] = lblCard7;
    lblArray[7] = lblCard8;
    lblArray[8] = lblCard9;
    lblArray[9] = lblCard10;
    }

    public static void initialPlay() {

    //Drawing of first 2 cards
    for (int i=0; i<2; i++) {
        Card draw = deck.draw();

        if (!playerArray[sequence].isDealer()) {
            lblArray[i].setText(draw.getName());
        }
        else {
            lblArray[i+5].setText(draw.getName());
        }
    }
    }

真的希望你能帮助我,因为我正在急于完成这个任务。非常感谢!

【问题讨论】:

    标签: java user-interface netbeans-6.9


    【解决方案1】:

    当您将标签放入数组时,gui(及其属性/成员)可能尚未初始化,因为 gui 创建是在另一个线程中完成的。

    删除 static 关键字并将分配标签的代码移动到 Blackjack-constructor。

    【讨论】:

    • 哦!我错过的一件事是它们在 initComponents() 方法中进行了初始化,该方法由 GUI Builder 自动生成。
    • 嘿,泰迪尔。再次查看您的建议,它有效!我将所有逻辑从 main() 方法移至 Blackjack() 构造函数并删除了静态修饰符,一切正常!实际上我很早就知道这一点,但自从我上次接触 GUI 以来已经有一段时间了,一定忘记了。无论如何,谢谢!不太确定“GUI创建在另一个线程中完成”是什么意思。 =)
    【解决方案2】:

    你还没有初始化名为Sequence的整数值?这可能就是为什么将 null 值分配给变量 Sequence 的原因。

    【讨论】:

    • 谢谢你的建议,酷先生!它不是特定于这个问题,但我确实忘记初始化“序列”变量。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2019-01-27
    • 2017-10-02
    • 1970-01-01
    • 2011-02-27
    • 2012-10-20
    相关资源
    最近更新 更多