Я получаю изображения через сокеты.Теперь я получаю его, но только один раз, как и ожидал.
Я проверил некоторые классы, в которые вы можете добавлять события, такие как ImageReader , но он не будет связываться с моим JFrame .Когда я заканчиваю свой фрейм, кажется, что он вообще не обновляется.
Сервер:
public static void main(String[] args) {
try {
DefaultWindow window = new DefaultWindow();
window.frame.setVisible(true);
ServerSocket ss = new ServerSocket(4305);
Socket cs = ss.accept(); // only 1 client is assumed
// this bit should be in some sort of complete event
BufferedImage bi = ImageIO.read(cs.getInputStream());
window.image.setIcon(new ImageIcon(bi));
window.frame.validate();
window.frame.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
Что мне делать?Какая лучшая практика?
РЕДАКТИРОВАТЬ 11-11-11 16: 19
Я следовал ответу mKorbel, и он, кажется, работает лучше, но я 'Я все еще получаю ошибки.
Мой клиентский скрипт:
public static void main(String[] args) {
try {
Socket cs = new Socket(InetAddress.getByName("localhost"), 4305);
OutputStream os = cs.getOutputStream();
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] gs = ge.getScreenDevices();
BufferedImage[] screenshots = new BufferedImage[gs.length];
DisplayMode mode;
Rectangle bounds;
while(true) {
try {
for(int i = 0; i < gs.length; i++)
{
mode = gs[i].getDisplayMode();
bounds = new Rectangle(0, 0, mode.getWidth(), mode.getHeight());
screenshots[i] = new Robot(gs[i]).createScreenCapture(bounds);
}
if(screenshots[0] != null) {
ImageIO.write(screenshots[0], "png", os);
}
os.flush();
Thread.sleep(500);
} catch (AWTException e) {
} catch (InterruptedException e) {}
}
} catch(IOException e) {}
}
В этой строке я получаю исключение IndexOutOfBoundsException: ImageIO.write(screenshots[0], "png", os);
, где я записываю вывод в выходной поток.
Кажется, что цикл while выполняется 3 раза.Почему всего 3 раза?И почему он дает исключение IndexOutOfBoundsException?
РЕДАКТИРОВАТЬ 11-11-11 16: 38
Кажется, я его отсортировал, однако мой ярлыкне будет обновлятьЕсть идеи?
Сервер:
public static void main(String[] args) {
try {
final DefaultWindow window = new DefaultWindow();
window.frame.setVisible(true);
ServerSocket ss = new ServerSocket(4305);
final Socket cs = ss.accept();
SwingWorker<ImageIcon, Void> sw = new SwingWorker<ImageIcon, Void>() {
BufferedImage bi = ImageIO.read(cs.getInputStream());
BufferedImage bis;
Graphics2D graphics2D;
ImageIcon icon = null;
@Override
protected ImageIcon doInBackground() throws Exception {
bis = new BufferedImage(window.image.getWidth(), window.image.getHeight(), BufferedImage.TYPE_INT_ARGB);
graphics2D = bis.createGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
graphics2D.drawImage(bi, 0, 0, window.image.getWidth(), window.image.getHeight(), null);
graphics2D.dispose();
if(icon != null) {
icon.getImage().flush();
}
icon = new ImageIcon(bis);
return icon;
}
protected void done() {
window.image.setIcon(icon);
window.frame.validate();
window.frame.repaint();
}
};
sw.execute();
} catch (Exception e) {
e.printStackTrace();
}
}