Какой шаблон проектирования лучше всего подходит для обновления графического интерфейса при работе с другими потоками в Java (Swing)?
Например, представьте себе объект (например, пользовательскую панель JPanel), у которого есть JList, поддерживающий DefaultListModel. Поток, прослушивающий сокет, может получить данные, а затем хочет обновить JList на основе информации, полученной в сокете.
Я понимаю SwingUtilities.invokeLater, но это похоже на неуклюжий код, потому что на самом деле у меня есть много разных функций, которые можно вызывать (из потоков, отличных от EDT), которые манипулируют различными компонентами графического интерфейса.
Идея, о которой я подумал, заключается в создании какой-то системы обмена сообщениями с ArrayBlockingQueue. В основном я реализую Runnable и в вызове метода SwingUtilities.invokeLater я передаю this
. Затем метод запускается, но он действительно не знает, что делать, но именно здесь я выталкиваю сообщения из потокобезопасной очереди ArrayBlockingQueue.
Есть ли лучший шаблон проектирования, чем этот? Мой базовый класс JPanel
public class JPanelGUIThread extends JPanel implements Runnable
{
protected ArrayBlockingQueue<Object> guiUpdateMessages;
public JPanelGUIThread()
{
guiUpdateMessages = new ArrayBlockingQueue<Object>(10);
}
@Override
public void run()
{
while(guiUpdateMessages.size() > 0)
{
try
{
Object data = guiUpdateMessages.take();
if(data instanceof Object[])
{
handleGUIUpdateArray((Object[])data);
}
else
{
handleGUIUpdateObject(data);
}
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void handleGUIUpdateArray(Object[] objectArray)
{
}
public void handleGUIUpdateObject(Object object)
{
}
}
Моя основная JPanel
public JLabel getChatLabel()
{
return chatLabel;
}
public JTextArea getChatArea()
{
return chatArea;
}
public JScrollPane getChatScrollPane()
{
return chatScrollPane;
}
public JTextField getMychat()
{
return mychat;
}
public JButton getSendButton()
{
return sendButton;
}
//This method is called from the EDT, so no need to perform adding messages
@Override
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == sendButton)
{
client.sendChatInformation(mychat.getText());
mychat.setText("");
}
}
public void clearOldChat()
{
Object[] data = new Object[3];
data[0] = chatArea;
data[1] = MessageType.SET;
data[2] = "";
guiUpdateMessages.add(data);
SwingUtilities.invokeLater(this);
}
@Override
public void handleGUIUpdateArray(Object[] objectArray)
{
if(objectArray[0] == chatArea)
{
if(objectArray[1] == MessageType.APPEND)
{
chatArea.append((String) objectArray[2]);
}
else if(objectArray[1] == MessageType.SET)
{
chatArea.setText((String) objectArray[2]);
}
}
}
}
Object
в качестве кортежа. - person Basil Bourque   schedule 16.07.2020