JOptionPane.showMessageDialog не показывает текст

1

Кажется, у меня возникают некоторые проблемы при использовании метода JOptionPane.showMessageDialog(). Когда я использую метод, единственное, что настроено правильно, это название диалогов. Он не хочет отображать текст, который я предоставляю.

Вот код, который я использую, чтобы попытаться создать предупреждение:

 JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);

В приведенном выше коде представлен снимок:

Изображение 174551

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

Редактировать:

Мой основной класс: создает GUI, в который пользователь вводит информацию "Host" и "DisplayName". Когда они нажимают "Подключиться", создается новый поток (ClientConnectSocket).

public class Main extends JFrame {

public static JPanel contentPane;
private JTextField hostTxt;
public static JTextField displayNameTxt;

JLabel lblDisplayName = new JLabel("Display Name:");
JButton btnConnect = new JButton("Connect");
JLabel lblHost = new JLabel("Host:");


public static String username = "None :(";
public static String host = "localhost";

public static boolean connected = false;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Main frame = new Main();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public Main() {
    setType(Type.UTILITY);
    setTitle("Java Chat Client - v0.1");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 390, 200);
    contentPane = new JPanel();
    this.setResizable(false);
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);


    lblHost.setBounds(60, 11, 56, 19);
    contentPane.add(lblHost);

    hostTxt = new JTextField();
    hostTxt.setBounds(165, 10, 103, 20);
    contentPane.add(hostTxt);
    hostTxt.setColumns(10);


    btnConnect.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            if (hostTxt.getText() == null || displayNameTxt.getText() == null){

            }else{
                Thread ccs = new ClientConnectSocket(hostTxt.getText(), displayNameTxt.getText());
                ccs.start();
                while (!connected){
                    //System.out.println("Not connected yet..");
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("Yey, connected");
                username = displayNameTxt.getText();
                host = hostTxt.getText();

                EventQueue.invokeLater(new Runnable() {
                    public void run() {
                        try {
                            Chat frame = new Chat();
                            frame.setVisible(true);

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                dispose();

            }
        }
    });
    btnConnect.setBounds((this.getWidth()/2)- 70, 76, 89, 23);

    contentPane.add(btnConnect);

    displayNameTxt = new JTextField();
    displayNameTxt.setColumns(10);
    displayNameTxt.setBounds(165, 45, 103, 20);
    contentPane.add(displayNameTxt);


    lblDisplayName.setBounds(60, 41, 95, 29);
    contentPane.add(lblDisplayName);

    this.getRootPane().setDefaultButton(btnConnect);
}   

Класс ClientConnectSocket:

public class ClientConnectSocket extends Thread{

String host;
String name;

public ClientConnectSocket(String host, String displayName){
    this.host = host;
    this.name = displayName;
}

boolean b = true;

public void run(){
    try{
        while (b){
            Socket server = new Socket(host, 6969);
            System.out.println("Sending info to try and connect.");

            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));
            out.write("method=connect:displayName="+ name);
            out.flush();

            Thread.sleep(500);

            InputStream in = server.getInputStream();

            StringBuffer sb = new StringBuffer();
            byte[] buffer = new byte[1024];
            int buf;
            while ((buf = in.read(buffer)) != -1){
                String line = new String(buffer, 0, buf);

                sb.append(line);
            }
            in.close();
            System.out.println(sb.toString() + " || " + sb.toString().equalsIgnoreCase("connect"));

            if (sb.toString().equalsIgnoreCase("connect")){
                //Allow them to connect
                Main.connected = true;
            }else if(sb.toString().equalsIgnoreCase("invalid:Username")){
                //Tell them they have username already taken;
                 JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE);
                b = false;
            }

            server.close();
            out.close();
            in.close();

            b = false;
        }
    }catch (Exception e){
        System.exit(2);
        e.printStackTrace();
    }
}
  • 0
    Ваш компьютер не использует видеокарту nVidea? Если нет, подумайте о создании и публикации минимального примера программы .
  • 0
    Он использует видеокарту nVidia. Кажется, проблема возникает только тогда, когда я использую диалоги, поскольку JFrames работают нормально.
Показать ещё 4 комментария
Теги:
swing
jpanel
dialog

1 ответ

5
Лучший ответ

Ваш опубликованный фрагмент кода предполагает, что вы столкнулись с проблемой Threading Swing. Если ваша программа является GUI Качели, то большинство из приведенного выше кода должно быть отозваны свинга EDT или E вентиляционная D ispatch T hread, в то время как любые распашные вызовы, включая отображение JOptionPane должен быть вызван на EDT. Для получения более конкретной помощи подумайте о том, чтобы рассказать и показать больше о вашем коде и использовании фонового потока.


редактировать
Хорошо, так что код находится в фоновом потоке. Итак, теперь вы должны позаботиться о том, чтобы показать свою JOptionPane на EDT. Рассмотрите возможность внесения этих изменений:

} else if(sb.toString().equalsIgnoreCase("invalid:Username")) {

    b = false;

    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, "alert", "alert", 
               JOptionPane.ERROR_MESSAGE);          
        }
    });
}

Примечание: код не проверяется путем компиляции или запуска. Пожалуйста, будьте осторожны с опечатками.


Изменить 2
В стороне, у вас есть другие проблемы, в том числе, что связанная переменная не должна быть статичной. У вас также есть проблемы с потоками:

 btnConnect.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent arg0) {
        if (hostTxt.getText() == null || displayNameTxt.getText() == null) {

        } else {

           // .........

           // ********** you should not have this type of code on the EDT
           while (!connected) {
              // ........
           }

           // ...............
        }
     }
   });
  • 0
    Огромное спасибо. Я принял во внимание то, что вы сказали, и предложил следующее решение (пожалуйста, скажите мне, могу ли я сделать это лучше / эффективнее): я создал статический метод в классе «Main», который я вызываю, если соединение установлено успешно ( Это создает следующее окно для пользователя). Это вызывается фоновым потоком (класс «ClientConnectSocket»), если соединение установлено успешно, устраняя необходимость в «while (! Connected)». Если соединение не установлено, то первое предоставленное вами редактирование вызывается (в фоновом режиме), чтобы отобразить сообщение об ошибке. Все работает
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню