java - Java访问动态创建的JFrame
问题描述
我正在创建一个用 Java 监视用户桌面的应用程序。有些客户端正在向服务器发送静态图像,服务器会为该连接刷新动态创建的 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,那么我创建它,但如果它存在,我只刷新它的内容。问题是我无法使用变量访问动态创建的 JFrame for(Frame fr : allFrames)
,但我需要用变量替换它的图像wIcon
。
解决方案
推荐阅读
- matlab - MATLAB coder app 2011版和2021版如何打开(MATLAB online)?
- linux - 如何确保 ffmpeg 库使用/不使用 GPU
- python - while 循环没有根据条件集正确运行
- c++ - createdefaultsubobject 函数不适用于 UWidgetComponent[UE4.26.2]
- sql - 如何减去多个日期?
- laravel - 我想获得下一个将被创建但尚未在 laravel 中创建的 id
- java - 如何将不同类别的面板放在框架上而不丢弃框架
- python - 有人可以帮我格式化函数的输出吗?
- networking - 我们可以使用一些工具将cisco命令发送到多个IP地址吗?
- python - 重新排序热图中的变量并仅使用高度相关的变量重新设计热图