То, что вы хотите, может быть достигнуто тремя способами: CSS мудрый:
.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;
}
(это решение имеет очень четкое преимущество встроенного 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;
}
абсолютное позиционирование после вычисления размеров сделанных элементов, через JavaScript (плацдарм кладки).
У вас есть две ошибки в вашей конструкции:
ss.accept()
является блокирующим вызовом, поэтому ваш пользовательский интерфейс замерзнет, пока не появится входящее соединение while(true)
в EDT. Вместо этого выполните следующие действия:
Проверьте это: http://javarevisited.blogspot.ro/2012/02/what-is-blocking-methods-in-java-and.html
1) Если вы пишете приложение графического интерфейса, оно может быть в Swing никогда не блокировать вызов в потоке диспетчера событий или в обработчике событий. например, если вы читаете файл или открываете сетевое соединение при нажатии кнопки, не делайте этого по методу actionPerformed (), вместо этого просто создавайте другой рабочий поток для выполнения этого задания и возвращаете из actionPerformed (). это будет заставлять ваш графический интерфейс реагировать, но опять-таки зависит от дизайна, если операция - это то, что требует от пользователя ожидания, а не использования invokeAndWait () для синхронного обновления.
blockquote>Использование нескольких потоков: http://javarevisited.blogspot.ro/2011/02/how-to-implement-thread-in-java.html
Попробуйте эти ...
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();
}
}
Вам понадобится многопоточность. Если бы я, где вы, я бы отделил код GUI и код сервера, а при нажатии кнопки я просто запустил код сервера как новый поток.
Ваш код замораживает графический интерфейс в основном потому, что все события выполняются в потоке Dispatcher потока (EDT), который является потоком, который заботится обо всех ваших файлах GUI и соответствующих событиях. Если вы либо заблокируете его, остановите его или выбросите в циклы, это повлияет на его производительность.
, пока ваш
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