Проблемы с обновлением текстов JLabel; относящийся к GUI Builder Netbeans 6.9

У меня возникли проблемы с обновлением текстов JLabels в моем графическом интерфейсе в программе, прикрепленной ниже.

LblArray кажется нулевым, хотя я присвоил каждой JLabel соответствующий индекс в массиве.

Я попытался поэкспериментировать со статическим модификатором, удалив статический модификатор из JLabels и, возможно, некоторые другие соответствующие переменные, такие как lblArray, и создав экземпляр класса Blackjack внутри метода main() и получив доступ к JLabels из этого нового объекта. Но результирующий интерфейс темпераментный, с разными результатами каждый раз, но в основном чередующийся между 3 типами сбоев графического интерфейса, которые иногда могли обновляться, но иногда не могли.

Графический интерфейс создается с помощью GUI Builder в NetBeans 6.9.

Я подозреваю, что это как-то связано со статическим модификатором. Пожалуйста, объясните мне, если это та проблема. Кроме того, могу ли я узнать, как мы на самом деле получаем доступ между статическими и нестатическими переменными или методами, особенно доступ к нестатическим переменным из статического метода 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());
        }
    }
    }

Очень надеюсь, что вы можете мне помочь, так как я спешу с этим заданием. Большое спасибо!


person Siea Chin Chuan    schedule 21.04.2011    source источник


Ответы (2)


Графический интерфейс (а вместе с ним и его атрибуты/члены) мог не быть инициализирован, когда вы помещаете метки в массив, поскольку создание графического интерфейса выполняется в другом потоке.

Удалите ключевое слово static и переместите свой код, присваивающий метки, в конструктор блэкджека.

person Tedil    schedule 21.04.2011
comment
Ой! Одна вещь, которую я упустил, это то, что они инициализируются в методе initComponents(), который автоматически генерируется GUI Builder. - person Siea Chin Chuan; 21.04.2011
comment
Привет, Тедил. Просмотрел ваш совет еще раз, и он работает! Я перенес всю свою логику из метода main() в конструктор Blackjack() и удалил статические модификаторы, и все работает! На самом деле я знал это раньше, но, должно быть, забыл, так как прошло некоторое время с тех пор, как я в последний раз прикасался к графическому интерфейсу. В любом случае, большое спасибо! Не совсем уверен, что означает создание графического интерфейса в другом потоке. знак равно - person Siea Chin Chuan; 23.04.2011

Вы не инициализировали значение целого числа с именем Sequence? Вероятно, поэтому переменной Sequence было присвоено нулевое значение.

person MrCooL    schedule 21.04.2011
comment
Спасибо за совет, MrCool! Это не относится к этой проблеме, но я действительно забыл инициализировать переменную последовательности. знак равно - person Siea Chin Chuan; 23.04.2011