Выполнение процесса с помощью кода замораживает программу до ее полного [дублирования]

То, что вы хотите, может быть достигнуто тремя способами: CSS мудрый:

1. flexbox:

    .parent {
        display: flex;
        flex-direction: column;
        flex-wrap: wrap;
        max-width: {max-width-of-container} /* normally 100%, in a relative container */
        min-height: {min-height-of-container}; /* i'd use vh here */
    }
    .child {
        width: {column-width};
        display: block;
    }

2. CSS-столбцы

(это решение имеет очень четкое преимущество встроенного column-span - довольно удобно для названий). Недостатком является упорядочивание элементов в столбцах (первый столбец содержит первую треть элементов и т. Д.). Для этого я сделал jsFiddle .

    .parent {
        -webkit-columns: {column width} {number of columns}; /* Chrome, Safari, Opera */
        -moz-columns: {column width} {number of columns}; /* Firefox */
        columns: {column width} {number of columns};
    }
    .child {
         width: {column width};
    }
    /* where {column width} is usually fixed size 
     * and {number of columns} is the maximum number of columns.
     * Additionally, to avoid breaks inside your elements, you want to add:
     */
    .child {
        display: inline-block;
        -webkit-column-break-inside: avoid;
        page-break-inside: avoid;
        break-inside: avoid-column;
    }

3. Масонский плагин

абсолютное позиционирование после вычисления размеров сделанных элементов, через JavaScript (плацдарм кладки).

4
задан Ionică Bizău 9 January 2013 в 17:27
поделиться

5 ответов

У вас есть две ошибки в вашей конструкции:

  1. ss.accept() является блокирующим вызовом, поэтому ваш пользовательский интерфейс замерзнет, ​​пока не появится входящее соединение
  2. Никогда не запускайте while(true) в EDT.

Вместо этого выполните следующие действия:

  • Когда кнопка нажата, создайте поток, который начнет прослушивать входящие соединения.
  • Всякий раз у вас есть входящее соединение, создайте еще один поток, который будет принимать входящее клиентское соединение и иметь дело с ним.
5
ответ дан GETah 21 August 2018 в 05:00
поделиться

Проверьте это: http://javarevisited.blogspot.ro/2012/02/what-is-blocking-methods-in-java-and.html

1) Если вы пишете приложение графического интерфейса, оно может быть в Swing никогда не блокировать вызов в потоке диспетчера событий или в обработчике событий. например, если вы читаете файл или открываете сетевое соединение при нажатии кнопки, не делайте этого по методу actionPerformed (), вместо этого просто создавайте другой рабочий поток для выполнения этого задания и возвращаете из actionPerformed (). это будет заставлять ваш графический интерфейс реагировать, но опять-таки зависит от дизайна, если операция - это то, что требует от пользователя ожидания, а не использования invokeAndWait () для синхронного обновления.

Использование нескольких потоков: http://javarevisited.blogspot.ro/2011/02/how-to-implement-thread-in-java.html

3
ответ дан CosminO 21 August 2018 в 05:00
поделиться

Попробуйте эти ...

1. During getting the initial connection delay can occur, so first create and empty socket,then try to connect to the server.

   `Socket s = new Socket();`

   `s.connect(new InetSocketAddress("ip_addr",port_nos),1000);`

2. And Secondly always keep the Non-UI work out of Your UI thread..

Вот мой пример сервера - связь с клиентом ..

Код на стороне клиента:

public class ClientWala {

    public static void main(String[] args) throws Exception{

        Boolean b = true;
    Socket s = new Socket();
    s.connect(new InetSocketAddress("127.0.0.1", 4444),1000);

    System.out.println("connected: "+s.isConnected());


    OutputStream output = s.getOutputStream();
    PrintWriter pw = new PrintWriter(output,true);

    // to write data to server
    while(b){

        if (!b){

             System.exit(0);
        }

        else {
            pw.write(new Scanner(System.in).nextLine());
        }
    }


    // to read data from server
    InputStream input   = s.getInputStream();
    InputStreamReader isr = new InputStreamReader(input);
    BufferedReader br = new BufferedReader(isr);
    String data = null;

    while ((data = br.readLine())!=null){

        // Print it using sysout, or do whatever you want with the incoming data from server

    }




    }
}

Код на стороне сервера:

import java.io.*
import java.net.*;


public class ServerTest {

    ServerSocket s;

    public void go() {

        try {
            s = new ServerSocket(44457);

            while (true) {

                Socket incoming = s.accept();
                Thread t = new Thread(new MyCon(incoming));
                t.start();
            }
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    class MyCon implements Runnable {

        Socket incoming;

        public MyCon(Socket incoming) {

            this.incoming = incoming;
        }

        @Override
        public void run() {

            try {
                PrintWriter pw = new PrintWriter(incoming.getOutputStream(),
                        true);
                InputStreamReader isr = new InputStreamReader(
                        incoming.getInputStream());
                BufferedReader br = new BufferedReader(isr);
                String inp = null;

                boolean isDone = true;

                System.out.println("TYPE : BYE");
                System.out.println();
                while (isDone && ((inp = br.readLine()) != null)) {

                    System.out.println(inp);
                    if (inp.trim().equals("BYE")) {
                        System.out
                                .println("THANKS FOR CONNECTING...Bye for now");
                        isDone = false;
                        s.close();
                    }

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                try {
                    s.close();
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                e.printStackTrace();
            }

        }

    }

    public static void main(String[] args) {

        new ServerTest().go();

    }

}
2
ответ дан Kumar Vivek Mitra 21 August 2018 в 05:00
поделиться

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

Ваш код замораживает графический интерфейс в основном потому, что все события выполняются в потоке Dispatcher потока (EDT), который является потоком, который заботится обо всех ваших файлах GUI и соответствующих событиях. Если вы либо заблокируете его, остановите его или выбросите в циклы, это повлияет на его производительность.

3
ответ дан npinti 21 August 2018 в 05:00
поделиться

, пока ваш

new socket(ss.accept());

немедленно возвращается, вам нужно только изменить свой

while (true)

, что помещает EDT (Event Dispatch Thread) в бесконечный цикл и ваш графический интерфейс становится безответственным. Итак, удалите эту строку.

Если вы не можете использовать класс SwingWorker ( http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker .html # process (java.util.List ) Создайте вложенный класс, который расширяет SwingWorker. Просто вызовите swingWoker.execute (); (после того, как вы создали его объект) в своем listenButtonActionPerformed (java.awt.event.ActionEvent evt) .

См. учебник: http://docs.oracle.com/javase/tutorial/uiswing/concurrency /worker.html

Никогда не создавайте новый поток и не запускайте его из Swing EDT

5
ответ дан vedant 21 August 2018 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: