Повторно открыть окно Java после скрытия его при закрытии

74
4

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

Я могу просто запустить приложение. Он создает главное окно. Я также использую setDefaultCloseOperation(HIDE_ON_CLOSE) Я также попробовал DISPOSE_ON_CLOSE но оба они имеют одинаковый эффект. Поэтому, когда я закрываю его, окно закрывается. Однако, когда я нажимаю на значок в моей доке, окно не будет открываться.

Я хочу, чтобы приложение открылось, как это делает Safari, вы можете закрыть сафари, но он по-прежнему работает в фоновом режиме, и когда вы нажимаете на значок в тире, он создает новое окно, если у вас еще нет открытого.

спросил(а) 2018-01-29T23:32:00+03:00 3 года, 1 месяц назад
1
Решение
120

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

    Клиент (рендер)
      Необходимо подключиться к серверу
        Если сервер не запущен, запустите сервер и подключитесь
          Сервер должен быть запущен как служба, фоновый процесс или может работать на другом компьютере (в примере я запускал его как фоновый процесс)
      Отображение данных, полученных с сервера Отправляет команды от пользователя на сервер
    Сервер (процесс)
      Не будет закрыто, если Принимает подключения от клиентов
        Если разрешен только один клиент за раз, отклоните новые соединения, пока клиент не отключится Если выполняется локально для клиента, порт должен принимать только локальные подключения
      Отправляет данные клиенту, который будет отображаться Получает команды от клиента

Чтобы продемонстрировать это, я собрал несколько примеров кода

Скомпилируйте оба файла в той же папке и запустите TestClient

TestClient.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class TestClient
{
public static void main(String[] args) throws Exception
{
Socket socket = null;
try
{
System.out.println("Connecting to backend");
socket = new Socket("localhost", 28000); //check if backend is running
}
catch(IOException e) //backend isn't running
{
System.out.println("Backend isn't running");
System.out.println("Starting backend");
Runtime.getRuntime().exec("cmd /c java TestServer"); //start the backend
for(int i = 0; i < 10; i++) //attempt to connect
{
Thread.sleep(500);
System.out.println("Attempting connection " + i);
try
{
socket = new Socket("localhost", 28000);
break;
}
catch(IOException ex){}
}
}

if(socket == null)
{
System.err.println("Could not start/connect to the backend");
System.exit(1);
}

System.out.println("Connected");
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

String line = reader.readLine();
System.out.println("read " + line);
if(line.equals("refused")) //already a client connected
{
System.err.println("Already a client connected to the backend");
System.exit(1);
}

//set up the GUI
JFrame frame = new JFrame("TestClient");
frame.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();

JLabel label = new JLabel(line);
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 4;
frame.add(label, c);

String[] buttonLabels = {"A", "B", "Quit"};
ActionListener listener = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(e.getActionCommand());
try
{
switch(e.getActionCommand())
{
case "A":
writer.write("A");
writer.newLine();
writer.flush();
break;
case "B":
writer.write("B");
writer.newLine();
writer.flush();
break;
case "Quit":
writer.write("Quit");
writer.newLine();
writer.flush();
System.exit(0);
break;
}
}
catch(IOException ex)
{
ex.printStackTrace();
System.exit(1);
}
}
};

c.gridy = 1;
c.gridx = GridBagConstraints.RELATIVE;
c.gridwidth = 1;
for(String s : buttonLabels)
{
JButton button = new JButton(s);
button.addActionListener(listener);
frame.add(button, c);
}

//start a thread to listen to the server
new Thread(new Runnable()
{
public void run()
{
try
{
for(String line = reader.readLine(); line != null; line = reader.readLine())
label.setText(line);
}
catch(IOException e)
{
System.out.println("Lost connection with server (probably server closed)");
e.printStackTrace();
System.exit(0);
}
}
}).start();

//display the gui
System.out.println("Displaying");
frame.pack();
frame.setResizable(false);
frame.setLocationByPlatform(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

TestServer.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class TestServer
{
private static boolean multipleClients = true;
private static List<Client> clients = new ArrayList<Client>();

public static void main(String[] args) throws Exception
{
System.out.println("did the thing");
ServerSocket ss = new ServerSocket(28000, 0, InetAddress.getByName(null));
int[] index = {0}; //array so threads can access
char[] data = {'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'};

//start accepting connections
new Thread(new Runnable()
{
public void run()
{
while(true)
{
try
{
Client c = new Client(ss.accept());
if(multipleClients || clients.isEmpty())
{
System.out.println("writing " + new String(data));
c.write(displayData(data, index[0])); //write initial data
synchronized(clients)
{
clients.add(c);
}
}
else
c.write("refused");
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}).start();

//read and write to clients
String msg = null;
while(true)
{
//read changes
synchronized(clients)
{
for(Client c : clients)
if((msg = c.read()) != null)
{
switch(msg)
{
case "A":
data[index[0]++] = 'A';
break;
case "B":
data[index[0]++] = 'B';
break;
case "Quit":
System.exit(0);
break;
}
index[0] %= data.length;
for(Client C : clients)
C.write(displayData(data, index[0]));
}
}
Thread.sleep(50);
}
}

private static String displayData(char[] data, int i)
{
return "<html>" + new String(data, 0, i) + "<u>" + data[i] + "</u>" + new String(data, i + 1, data.length - i - 1) + "</html>";
}

private static class Client
{
private BufferedReader reader;
private BufferedWriter writer;
private Queue<String> readBuffer;
private Client me;

public Client(Socket s) throws IOException
{
reader = new BufferedReader(new InputStreamReader(s.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
readBuffer = new LinkedList<String>();
me = this;

new Thread(new Runnable()
{
public void run()
{
try
{
for(String line = reader.readLine(); line != null; line = reader.readLine())
readBuffer.add(line);
}
catch(IOException e)
{
System.out.println("Client disconnected");
e.printStackTrace();
synchronized(clients)
{
clients.remove(me); //remove(this) attempts to remove runnable from clients
}
System.out.println("removed " + clients.isEmpty());
}
}
}).start();
}

public String read()
{
return readBuffer.poll();
}

public void write(String s)
{
try
{
writer.write(s);
writer.newLine();
writer.flush();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
}

ответил(а) 2018-01-31T20:34:00+03:00 3 года, 1 месяц назад
44

Чтобы свернуть вместо закрытия, используйте JFrame.DO_NOTHING_ON_CLOSE и обработайте запрос на закрытие

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
frame.setExtendedState(JFrame.ICONIFIED);
}
});

Это минимизирует кадр, тогда пользователь может щелкнуть значок на панели задач, чтобы восстановить

ответил(а) 2018-01-29T23:55:00+03:00 3 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема