Мой текст JLabel не изменится

Я создаю окончательный проект для моего курса компьютерного программирования и столкнулся со странной проблемой, с которой я надеюсь, что кто-то сможет мне помочь. Я пытаюсь создать программу для игры в блэкджек, которая будет работать между двумя компьютерами, но у меня возникают проблемы с изменением текста моих меток сверх того, на что они изначально установлены. Чтобы сделать этот проект, я использую компилятор eclipse с надстройкой для создания окон.

Сама проблема заключается в метке «lblEnterTextHere», текст которой не изменится, когда я попытаюсь сделать это в методе rungame. Случайные сообщения System.out.print должны были проверять, достигает ли код даже точки, в которой запускается этот метод, и это происходит. Печатается "Ожидание соединения".

Примечание. Я новичок в Java, и это всего лишь курс для 12-го класса, поэтому, пожалуйста, объясните свой ответ ясно. Это очень помогло бы. Кроме того, это еще даже не игра, просто скелет того, что я пытаюсь сделать.

Мой код:

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import java.io.*;
import java.net.*;
public class Window {

ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
private JFrame frame;
JLabel label_5;
JButton btnNewButton;
JLabel label;
JLabel label_1;
JLabel label_2;
JLabel label_3;
JLabel label_4;
JLabel label_6;
JLabel label_7;
JLabel label_8;
JLabel label_9;
JLabel lblPlayerOneyou;
JLabel lblPlayerother;
JLabel lblNewLabel;
JLabel lblScore;
JLabel lblNewLabel_1;
JLabel lblNewLabel_2;
JButton btnNewButton_1;
JLabel lblStatus;
JLabel lblEnterTextHere;


public static void main(String[] args) {
    Window window = new Window();
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Window window2 = new Window();
                window2.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    System.out.print("Hello.");
    window.runGame();
}

public Window() {
    frame = new JFrame();
    frame.setBounds(100, 100, 792, 536);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    label_5 = new JLabel("New label");
    label_5.setEnabled(false);
    label_5.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_5.setBounds(36, 74, 110, 145);
    frame.getContentPane().add(label_5);

    btnNewButton = new JButton("First Draw");
    btnNewButton.setEnabled(false);
    btnNewButton.setBounds(661, 125, 89, 94);
    frame.getContentPane().add(btnNewButton);

    label = new JLabel("New label");
    label.setEnabled(false);
    label.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label.setBounds(156, 74, 110, 145);
    frame.getContentPane().add(label);

    label_1 = new JLabel("New label");
    label_1.setEnabled(false);
    label_1.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_1.setBounds(276, 74, 110, 145);
    frame.getContentPane().add(label_1);

    label_2 = new JLabel("New label");
    label_2.setEnabled(false);
    label_2.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_2.setBounds(393, 74, 110, 145);
    frame.getContentPane().add(label_2);

    label_3 = new JLabel("New label");
    label_3.setEnabled(false);
    label_3.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_3.setBounds(516, 74, 110, 145);
    frame.getContentPane().add(label_3);

    label_4 = new JLabel("New label");
    label_4.setEnabled(false);
    label_4.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_4.setBounds(36, 267, 110, 145);
    frame.getContentPane().add(label_4);

    label_6 = new JLabel("New label");
    label_6.setEnabled(false);
    label_6.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_6.setBounds(156, 267, 110, 145);
    frame.getContentPane().add(label_6);

    label_7 = new JLabel("New label");
    label_7.setEnabled(false);
    label_7.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_7.setBounds(270, 267, 110, 145);
    frame.getContentPane().add(label_7);

    label_8 = new JLabel("New label");
    label_8.setEnabled(false);
    label_8.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_8.setBounds(393, 267, 110, 145);
    frame.getContentPane().add(label_8);

    label_9 = new JLabel("New label");
    label_9.setEnabled(false);
    label_9.setIcon(new ImageIcon("C:\\Users\\Alexander Wong\\Documents\\Cards\\cardBack.jpg"));
    label_9.setBounds(516, 267, 110, 145);
    frame.getContentPane().add(label_9);

    lblPlayerOneyou = new JLabel("Player one (You)");
    lblPlayerOneyou.setBounds(46, 26, 100, 24);
    frame.getContentPane().add(lblPlayerOneyou);

    lblPlayerother = new JLabel("Player 2 (Other player)");
    lblPlayerother.setBounds(49, 241, 123, 14);
    frame.getContentPane().add(lblPlayerother);

    lblNewLabel = new JLabel("Score:");
    lblNewLabel.setBounds(170, 31, 46, 14);
    frame.getContentPane().add(lblNewLabel);

    lblScore = new JLabel("Score:");
    lblScore.setBounds(170, 242, 46, 14);
    frame.getContentPane().add(lblScore);

    lblNewLabel_1 = new JLabel("0");
    lblNewLabel_1.setBounds(220, 31, 46, 14);
    frame.getContentPane().add(lblNewLabel_1);

    lblNewLabel_2 = new JLabel("??");
    lblNewLabel_2.setBounds(220, 241, 46, 14);
    frame.getContentPane().add(lblNewLabel_2);

    btnNewButton_1 = new JButton("Quit");
    btnNewButton_1.setEnabled(false);
    btnNewButton_1.setBounds(661, 261, 89, 87);
    frame.getContentPane().add(btnNewButton_1);

    lblStatus = new JLabel("Status:");
    lblStatus.setBounds(23, 458, 46, 14);
    frame.getContentPane().add(lblStatus);

    lblEnterTextHere = new JLabel("Enter text here");
    lblEnterTextHere.setBounds(63, 458, 109, 14);
    frame.getContentPane().add(lblEnterTextHere);

}

public void runGame() {
    try {
        System.out.println("Hello.");
        providerSocket = new ServerSocket(5131, 10);
        lblEnterTextHere.setText("Waiting for connection");
        System.out.println("Waiting for connection");
        lblStatus.setText("me");
        connection = providerSocket.accept();
        lblEnterTextHere.setText("Connection received from " + connection.getInetAddress().getHostName());
        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();
        in = new ObjectInputStream(connection.getInputStream());
        out.writeInt(-1);
        out.flush();
        System.out.println("All systems go.");
        try {
            in.close();
            out.close();
            providerSocket.close();
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    } catch (IOException ioException){
        ioException.printStackTrace();
    }

}

}


person user1964932    schedule 09.01.2013    source источник
comment
Доходит ли ваша программа до строки lblEnter? Или он зависает/выдает ошибку в методе accept()?   -  person Mark    schedule 10.01.2013
comment
На этом он останавливается, потому что мне еще предстоит создать клиентскую программу, с которой он мог бы взаимодействовать.   -  person user1964932    schedule 10.01.2013


Ответы (1)


Вы блокируете EDT, размещая функциональность ServerSocket в этом потоке. Поместите функции из runGame в SwingWorker и пользовательский интерфейс. будет бесплатно обновлять свои компоненты.

Поскольку вам не требуется информация о возврате, вы можете использовать SwingWorker<Void, Void>

См. этот похожий пост.

person Reimeus    schedule 09.01.2013
comment
Это, наверное, нелепая просьба, но не могли бы вы сказать мне, как мне это сделать? Я не могу понять, как реализовать это с помощью моего метода, так как в примере он использует массив, и я не знаю, как его изменить, чтобы он работал с моим методом. - person user1964932; 10.01.2013
comment
@user1964932 Ознакомьтесь с примерами Worker Threads и SwingWorker. - person MadProgrammer; 10.01.2013
comment
@MadProgrammer Эта ссылка находится в ответе :) - person Reimeus; 10.01.2013
comment
@Reimeus Извините, пропустил это: P - Теперь у ОП нет оправдания;) - person MadProgrammer; 10.01.2013
comment
Не сработало, мои коды, вероятно, просто неверны. Посмотрел другие примеры и учебные пособия, не смог заставить их работать. Я, вероятно, просто откажусь от проекта, это выше моих сил, учитывая, что мы только что узнали о массивах месяц назад. Я даже не могу понять ничего, что говорят учебники. Всем большое спасибо за помощь, и извините за потраченные впустую усилия. - person user1964932; 10.01.2013