Java Socket не позволяет показывать поворотный кадр - PullRequest
1 голос
/ 31 марта 2019

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

static JTextField textField         = null;
static JTextArea messageArea        = null;
static String serverAddress         = "localhost";
static UFTtrack window              = null;

public static JFrame frame;
public ImageIcon[] images;
static JTable table;
Date lastUpdate;
static Timer timer;
static Scanner in;
static PrintWriter out;

public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @SuppressWarnings({ "static-access" })
            public void run() {
                try {
                    UIManager.setLookAndFeel(new MaterialLookAndFeel());
                } catch (UnsupportedLookAndFeelException e1) {
                    e1.printStackTrace();
                }

                try {
                    window = new UFTtrack();

                    placeChatOnScreen();
                    createTable();
                    SystemTrayz.createTray();

                    centreWindow(frame);
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

public UFTtrack() {
   initialize();
}

private void initialize() {
        frame = new JFrame("UFTtrack");
        frame.setTitle("UFT Tracker");
        frame.setResizable(false);
        frame.setLocationByPlatform(true);
        frame.setSize(1308, 900);
        frame.setBounds(100, 100, 450, 300);
        frame.setMinimumSize(new Dimension(1308, 900));
        frame.setPreferredSize(new Dimension(1308, 900));
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }

@SuppressWarnings({ "resource", "unused" })
private static void placeChatOnScreen() {
    try {                       
        textField = new JTextField();
        textField.setFont(new Font("Segoe UI", Font.PLAIN, 13));
        textField.setDragEnabled(true);
        textField.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
        textField.setBounds(338, 838, 954, 22);
        frame.getContentPane().add(textField);

        messageArea = new JTextArea();
        messageArea.setEditable(false);
        messageArea.setFont(new Font("Segoe UI", Font.PLAIN, 13));
        messageArea.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
        messageArea.setDragEnabled(true);
        messageArea.setName("chatArea");
        messageArea.setWrapStyleWord(true);
        messageArea.setBounds(338, 648, 954, 181);
        frame.getContentPane().add(messageArea);

        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                out.println(textField.getText());
                textField.setText("");
            }
        });

        Socket socket = new Socket("localhost", 8877);

        in = new Scanner(socket.getInputStream());
        out = new PrintWriter(socket.getOutputStream(), true);

        while (in.hasNextLine()) {
            String line = in.nextLine();

            if (line.startsWith("SUBMITNAME")) {
                out.println(getName());
            } else if (line.startsWith("NAMEACCEPTED")) {
                textField.setEditable(true);
            } else if (line.startsWith("MESSAGE")) {
                messageArea.append(line.substring(8) + "\n");
            }
        }
    } catch (IOException e1) {
        e1.printStackTrace();
    }
}

Это нормально, пока не достигнет "NAMEACCEPTED" else, если условие, и он просто выйдет из цикла whileи тогда ничего не происходит.Никаких ошибок.Это просто не то, как качающаяся рама!

Если я закомментирую:

/*while (in.hasNextLine()) {
    String line = in.nextLine();

    if (line.startsWith("SUBMITNAME")) {
        out.println(getName());
    } else if (line.startsWith("NAMEACCEPTED")) {
        textField.setEditable(true);
    } else if (line.startsWith("MESSAGE")) {
        messageArea.append(line.substring(8) + "\n");
    }
}*/

и запустим ее, качающаяся рама загружается просто отлично.Но мой Socket (который мне нужен в моем приложении Swing) почему-то пропускает его.

window = new UFTtrack();

placeChatOnScreen();
createTable();
SystemTrayz.createTray();

centreWindow(frame);
window.frame.setVisible(true);

Чтобы подвести итог всего этого - вышеприведенный код попадает в window = new UFTtrack (); и placeChatOnScreen () но после выхода из цикла While в placeChatOnScreen () оно никогда не переходит на createTable (); В чем дело ???

Также размещено здесь:

http://www.javaprogrammingforums.com/whats-wrong-my-code/41820-java-socket-not-allowing-swing-frame-show-up.html#post165295 https://coderanch.com/t/708072/java/Java-Socket-allowing-swing-frame https://www.dreamincode.net/forums/topic/415549-java-socket-not-allowing-swing-frame-to-show-up/ Java Socket нетразрешение показа поворотной рамки

1 Ответ

0 голосов
/ 31 марта 2019

Как уже упоминалось в комментариях, операции read и accept обычно блокируются на Socket.

Вы можете создать собственный Thread, который ожидает сообщения от вашего Socket, а затем изменить графический интерфейс. Помните, что Swing не безопасен для потоков.

Если мне нужно создать собственный Thread, я использую интерфейс Runnable. Вы можете достичь этого следующим образом:

public class MySocketListener implements Runnable {

    private final GUIClass guiClass;
    private final ServerSocket serverSocket;
    private Socket clientSocket;

    public MySocketListener(GUIClass guiClass, ServerSocket serverSocket) {
        this.guiClass = guiClass;
        this.serverSocket = serverSocket;
    }

    /* Everything that happens in this method, is done on another Thread. */
    @Override
    public void run() {
        try{
            this.clientSocket = this.serverSocket.accept();
            Scanner sc = new Scanner(this.clientSocket.getInputStream());

            while(true) {
                /* Blocking operations */
                this.guiClass.doSomething();
            }
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }
}

Затем можно легко запустить Thread:

Thread socketListenerThread = new Thread(new MySocketListener(this, serverSocket));
socketListenerThread.start();

Для получения дополнительной информации см. Документацию Thread и Socket .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...