Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > передавать изменение окна с графикой


Автор: elija 12.6.2010, 21:05
Сразу извиняюсь за некорректное название темы.
Надо сделать так, чтобы можно было передавать новые объекты от клиента к серверу и наоборот. Если звезда вращается у сервера, то передаю данные клиенту, и у него тоже появляется звезда и начинает вращаться. Не знаю, как это реализовать. знаю только, что надо делать через сериализацию, сокеты...А как это сделать - не знаю.
Исходный код, из которого надо это сделать:
Звезды появляются на среднюю кнопку мыши, вращаются на колесико.

Main.java
Код

import java.awt.Button;
import java.awt.Checkbox;
import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.*;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Main extends JComponent implements Runnable, Serializable // JComponent используется для addMouseListener 
{
     private class MouseClick extends MouseAdapter 
     {
         // @Override
         public void mousePressed(MouseEvent evt)  //
         {
                  if ((evt.getModifiers() & InputEvent.BUTTON1_MASK) != 0)
                  {
                  System.out.println("left " + (evt.getPoint()));  
                  }
                if ((evt.getModifiers() & InputEvent.BUTTON2_MASK) != 0)
                {
                  System.out.println(("STARS count: ") + Square.squares.size());
                  Square.addItem(f,Square.speed,evt.getPoint().x,evt.getPoint().y,Square.color);
                }
                if ((evt.getModifiers() & InputEvent.BUTTON3_MASK) != 0) 
                {
                  System.out.println("right " + (evt.getPoint()));
                }
         } 
     }
     
    private static final long serialVersionUID = 1L;

    public Thread t;
    Button BtnSave, BtnLoad;
    MouseClick mouse_control;
//    Server MyServer;
//    Client MyClient;
    Thread ServerThread = null;
    Square Star;
    
    
    Main MainFrame;

    class WheelEvent implements MouseWheelListener //создаем класс WheelEvent для "прослушивания" колеса мыши.
    {                                                
//    @Override
            public void mouseWheelMoved(MouseWheelEvent evt) 
            {
            if (evt.getScrollType()==MouseWheelEvent.WHEEL_UNIT_SCROLL);  //MouseWheelEvent - имеет два события при вращении колеса мыши
            if (-1 == evt.getWheelRotation())                            // -1 - вращение вниз и 1 - вращение вверх
            {                                                            //MouseWheelEvent так же 
                Square.speed--;                                                //уменьшаем скорость, если колесо вращается вниз        
                  for (int i = 0; i < Square.squares.size(); i++) 
                  {
                   Square.squares.get(i).angle = Square.speed;
                  }
            }
            else Square.speed++;
              for (int i = 0; i < Square.squares.size(); i++) 
              {
               Square.squares.get(i).angle = Square.speed;
              }
        }
    }

    WheelEvent mousewheel_control;
 Main()
        {
        t = new Thread(this);//создаем поток
        System.out.println("поток создан");
        t.start(); //запускаем поток. появляется окно программы
        System.out.println("поток запущен");
        mouse_control = new MouseClick();
        mousewheel_control = new WheelEvent();
        addMouseListener(mouse_control);            //JComponent 
        addMouseWheelListener(mousewheel_control);  //JComponent 
        
        
        BtnSave = new Button("Сохранить");
        BtnSave.setBounds(5, 31, 120, 20);
        BtnSave.addActionListener
            (
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        if (Square.squares != null)
                        {
                            try
                            {
                                ObjectOutputStream out1 = new ObjectOutputStream(new FileOutputStream("ser.dat"));
                                out1.writeObject(Star);
                                out1.close();
                            }
                            catch (IOException e1)
                            {
                                System.out.println("\nОшибка при сохранении.\n");
                            }
                        }
                    }
                }
            );
        add(BtnSave);
        
        BtnLoad = new Button("Загрузить");
        BtnLoad.setBounds(5, 51, 120, 20);
        BtnLoad.addActionListener
            (
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        try
                        {
                            ObjectInputStream in1 = new ObjectInputStream(new FileInputStream("ser.dat"));
                           
                            repaint();
                        }
                        catch (Exception e1)
                        {
                            System.out.println("\nОшибка при загрузке.\n");
                        }
                    }
                }
            );
        add(BtnLoad);

        } 
     public void run()
     {
      try
      {
       while(true)
       {
           Thread.currentThread();
           Thread.sleep(100);
           for (int i = 0; i < Square.squares.size(); i++) 
           {
               Square.squares.get(i).rotateRect();
               Square.squares.get(i).repaint();
           }
       }
      }
      catch(Exception ex){}
     }
     public static JFrame f=new JFrame("STARS");     
         public static void main(String [] args)
         {
            Main m = new Main();
            m.setBorder(javax.swing.BorderFactory.createLineBorder(java.awt.Color.BLACK)); 
            m.setSize(new java.awt.Dimension(600, 600));    
        //    m.setBackground(Color.black);
         f.setLayout(null);
         Square.squares = new ArrayList<Square>();
         f.add(m);
         f.setSize(400, 400);
         f.setResizable(false);
         f.setVisible(true);
         f.getContentPane().add(m);
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         }
 }



Square.java
Код

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.*;
import java.io.Serializable;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Square extends JComponent implements Serializable// наследуем класс от JСomponent
{    
    
    /**
     * 
     */
    private static final long serialVersionUID = -4950318742355216778L;
    AffineTransform at = new AffineTransform();
     int angle=0;
     int width=0, height=0;
     Square(int angle, int width, int height)
     {
      this.angle=angle;
      this.width=width;
      this.height=height;
    
     }
        public static int color;
        public static int speed;
        public static ArrayList<Square> squares;
        Frame Frm;
         public static void addItem(JFrame frame, int d, int width, int height, int color) 
            {
                Square sq = new Square(d,width, height);
                sq.setBounds(0, 0, 1024, 1000);
                //this.squares.add(sq);
                squares.add(sq);
                frame.add(sq);
            }

            public void setFrm(Frame ff)
            {
                Frm = ff;    
            }
        
     public void paint(Graphics g) //Graphics g используется для рисования. 
     {
      Graphics2D g2=(Graphics2D)g;      //Graphics2D - определяет текущее графическое состояние и методы графического вывода
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
       Path2D.Double path = new Path2D.Double();
       path.moveTo(width, -42 + height);
       path.lineTo(10 + width, -12 + height);
       path.lineTo(40 + width, -12 + height);
       path.lineTo(16 + width, 6 + height);
       path.lineTo(26 + width, 36 + height);
       path.lineTo(width, 18 + height);
       path.lineTo(-26 + width, 36 + height);
       path.lineTo(-16 + width, 6 + height);
       path.lineTo(-40 + width, -12 + height);
       path.lineTo(-10 + width, -12 + height);
       
       
       /*
       path.moveTo(width, -21 + height);
       path.lineTo(5 + width, -6 + height);
       path.lineTo(20 + width, -6 + height);
       path.lineTo(8 + width, 3 + height);
       path.lineTo(13 + width, 18 + height);
       path.lineTo(width, 9 + height);
       path.lineTo(-13 + width, 18 + height);
       path.lineTo(-8 + width, 3 + height);
       path.lineTo(-20 + width, -6 + height);
       path.lineTo(-5 + width, -6 + height);
       */
       
       path.closePath();
       path.transform(at);
       g2.setColor(Color.RED);
       g2.draw(path);  //выводим контур фигуры
  //     g2.fill(path);  //выводим закрашенную фигуру
        }
     public void rotateRect()
     {
          at.rotate(Math.toRadians(angle), width, height);
    }

}

Автор: jk1 16.6.2010, 11:15
Для сериализации компонентов Swing очень удобно использовать XMLEncoder/XMLDecoder, более того
Цитата

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see java.beans.XMLEncoder.

и это указано в доках практически ко всем компонентам Swing. Таким образом, традиционная сериализация  в этом случае является не очень хорошим решением.
Что касается передачи данных через сокеты, http://java.sun.com/docs/books/tutorial/networking/sockets/clientServer.htmlесть хороший пример на этот счет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)