Я создаю приложение, которое отслеживает рабочий стол пользователя в Java. Есть клиенты, которые отправляют изображения stati c на сервер, и сервер обновляет динамически созданный JFrame для этого соединения. Я хочу создать JFrame для каждого несуществующего соединения.
package screensender;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Image;
import java.net.*;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class ScreenSender extends Thread
{
private ServerSocket serverSocket=null;
private static Socket server = null;
private Date date = null;
private static final String DIR_NAME = "SACHIN";
public ScreenSender() throws IOException, SQLException, ClassNotFoundException, Exception{
serverSocket = new ServerSocket(1729);
serverSocket.setSoTimeout(1800000);
}
public void run()
{
JFrame frame = new JFrame("Viewer");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JLabel message = new JLabel();
JLabel wIcon = new JLabel();
ArrayList<String> framecimek = new ArrayList<String>();
while(true)
{
try
{
server = serverSocket.accept();
date = new Date();
DateFormat dateFormat = new SimpleDateFormat("_yyMMdd_HHmmss");
String fileName = server.getInetAddress().getHostName().replace(".", "-");
BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream()));
int width = img.getWidth();
int height = img.getHeight();
ImageIO.write(img, "jpg", new File("C:\\CFEDITSNAPS\\"+fileName+".jpg"));
Frame[] allFrames = Frame.getFrames();
for(Frame fr : allFrames){
String specificFrameName = fr.getTitle();
if(!framecimek.contains(fileName))
{
framecimek.add(fileName);
JFrame frame2 = new JFrame(fileName);
frame2.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JLabel message2 = new JLabel();
JLabel wIcon2 = new JLabel();
frame2.setPreferredSize(new Dimension(width+15, height+39));
frame2.pack();
frame2.setVisible(true);
try {
img = ImageIO.read(new File("C:\\CFEDITSNAPS\\"+fileName+".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
Image dimg2 = img.getScaledInstance(width, height,
Image.SCALE_SMOOTH);
ImageIcon wPic2 = new ImageIcon(dimg2);
wIcon2.setIcon(wPic2);
frame2.remove(wIcon2);
frame2.add(wIcon2);
SwingUtilities.updateComponentTreeUI(frame2);
} else if(framecimek.contains(fileName) && specificFrameName.equals(fileName))
{
fr.setPreferredSize(new Dimension(width+15, height+39));
fr.pack();
fr.setVisible(true);
try {
img = ImageIO.read(new File("C:\\CFEDITSNAPS\\"+fileName+".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
Image dimg = img.getScaledInstance(width, height,
Image.SCALE_SMOOTH);
ImageIcon wPic = new ImageIcon(dimg);
wIcon.setIcon(wPic);
fr.remove(wIcon);
fr.add(wIcon);
SwingUtilities.updateComponentTreeUI(fr);
}
}
}
catch(SocketTimeoutException st)
{
System.out.println("Socket timed out!");
break;
}
catch(IOException e)
{
e.printStackTrace();
break;
}
catch(Exception ex)
{
System.out.println(ex);
}
}
}
public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception{
ScreenSender serverApp = new ScreenSender();
serverApp.createDirectory(DIR_NAME);
Thread thread = new Thread(serverApp);
thread.start();
}
private void createDirectory(String dirName) {
File newDir = new File("C:\\"+dirName);
if(!newDir.exists()){
boolean isCreated = newDir.mkdir();
}
}
}
Идея состоит в том, что если соединение предоставляет несуществующий JFrame, то я создаю его, но если оно существует, я только обновляю sh его содержимое , Проблема в том, что я не могу получить доступ к динамически созданному JFrame с переменной for(Frame fr : allFrames)
, но мне нужно заменить его изображение на переменную wIcon
.