Obsługa wielu obrazków

0

Witam wszystkich

Piszę aplikacje mającą umożliwiać projektowanie prostej struktury sieci komputerowej. Program ma:
-dodawać kolejne obrazki do panela
-umożliwiać ich dowolne rozmieszczenie na panelu za pomocą myszki
Natrafiłem na problem w momencie dodawania wielu obrazków do panela, zamiast dodawać kolejne, zamieniam jeden na drugi. Domyślam się ze muszę jakoś zmodyfikować klasę paint, ale nie mam pomysłu jak.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;

public class LoadImg extends JPanel implements ActionListener
//,MouseListener, MouseMotionListener
{

    BufferedImage img, ru;
    String name;
    int x, y, i;

    static final private String RUTER = "ruter";
    static final private String HOST = "host";
    static final private String SWITCH = "switch";
    static final private String ACCESS_POINT = "access_point";
    static final private String WAN = "wan";
//  static final private String DRUKARKA = "drukarka";
//  static final private String IP_TEL = "ip_tel";
//  static final private String SERWER = "serwer";
//  static final private String RJ45 = "rj45";
//  static final private String WIFI = "wifi";
//  static final private String SWIATLOWOD = "swiatlowod";
//  static final private String KOMENTARZ = "komentarz";

    LoadImg(){
    setBackground(Color.WHITE);
    addMouseMotionListener(new MouseMotionHandler());

    //int last_x, last_y;
   // boolean firstTime = true;
   // boolean pressOut = false;

   // addMouseMotionListener(this);
   // addMouseListener(this);

    }

     class MouseMotionHandler extends MouseMotionAdapter {
            public void mouseDragged(MouseEvent e) {
              x = e.getX();
              y = e.getY();
              repaint();
            }
          }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(img, x, y, null);

    }

      public Dimension getPreferredSize() {
            if (img == null) {
                 return new Dimension(100,100);
            } else {
               return new Dimension(img.getWidth(null), img.getHeight(null));
           }
      }

      public void LoadImageApp(String name){

          if (name != null )
            i++;
         // System.out.println(i);
           try {
               img  = ImageIO.read(new File("pic/obiekty/"+name+".gif"));
           } catch (IOException e) {
           }
           System.out.println("wczytano: "+name+ i);
        }

      public void createToolbar(){

          JToolBar toolBar = new JToolBar(); 
        addButtons(toolBar);
        toolBar.setFloatable(true);
        toolBar.setRollover(true);
        add(toolBar, BorderLayout.NORTH);

        }

      void addButtons(JToolBar toolBar){
          JButton button = null;

          button = makeNavigationButton("truter", RUTER,
             "Dodaj ruter",
             "Ruter");
          toolBar.add(button);

          button = makeNavigationButton("tswitch", SWITCH,
             "Dodaj switch",
             "Switch");
          toolBar.add(button);

          button = makeNavigationButton("tacpo", ACCESS_POINT,
             "Dodaj access point-a",
             "Access Point");
          toolBar.add(button);

          button = makeNavigationButton("tisp", WAN,
             "Dodaj polączenie WAN",
             "Switch");
          toolBar.add(button);

          button = makeNavigationButton("thost", HOST,
             "Dodaj host-a",
             "Host"); 
          toolBar.add(button);

}

protected JButton makeNavigationButton(String imageName,
        String actionCommand,
        String toolTipText,
        String altText) {
            //wyszukiwanie obrzkow
            String imgLocation = "pic/pasek/"+imageName+".gif";
    URL imageURL = LoadImg.class.getResource(imgLocation);

        //tworzenie  i inicjalizacja przyciskow
            JButton button = new JButton();
            button.setActionCommand(actionCommand);
            button.setToolTipText(toolTipText);
            button.addActionListener(this);

if (imageURL != null) {                      //obrazek znaleziony
button.setIcon(new ImageIcon(imageURL, altText));
} else {                                     //obrazek nie znaleziony
button.setText(altText);
System.err.println("Nie znalezniono obrazka: "
+ imgLocation);
}

return button;
}

public void actionPerformed(ActionEvent e) {
    String cmd = e.getActionCommand();
    String description = null;

    // obsluga paska
    if (RUTER.equals(cmd)) { //pierwszy akcja
        description = "ruter";
   //   LoadRuter();
    } else if (HOST.equals(cmd)) { //drugi akcja
        description = "host";
    }
    name = description;
    LoadImageApp(name);
    repaint();
}

public static void createShowGUI(){
    JFrame f = new JFrame("Wyswietlanie");
    LoadImg lImg = new LoadImg();
    lImg.createToolbar();
    f.setDefaultCloseOperation(3);
    f.setLayout(new BorderLayout());
    f.setSize(400,300);
    //f.setLayout(new FlowLayout());
    f.setVisible(true);
    lImg.setOpaque(true); 
    f.setContentPane(lImg);

}

public static void main(String[] args){
    SwingUtilities.invokeLater(new Runnable(){
        public void run(){
        createShowGUI();
        }
    });
}
}
1

Musisz mieć listę obrazków, z której paint będzie malował każdy kolejny w jakiejś określonej kolejności i na konkretnej pozycji w panelu. Oprócz tego obrazek, który będzie wleczony myszą będzie musiał być "na wierzchu" (czyli zazwyczaj powinien być ostatnim malowanym). Powinieneś też użyć repaint w wersji, która określa granice odmalowywania w przypadku wleczenia obrazka (te granice powinny określać prostokąt obejmujący obszar starego położenia tego obrazka oraz nowego).
Oczywiście dodając nowy obrazek musisz go dodać do listy (to samo z usuwaniem).

0

Pięknie dziękuje z oświecenie mojej osoby, teraz przynajmniej wiem z czym się bawić dalej.

0

Witam

Mam program który który dodaje/usuwa obrazki i maluje je w zdanej pozycji. Jednak w momencie w którym chce zmienić rodzaj dodawanego obrazka na inny zmieniają się wszystkie obrazki na panelu.

Próbowałem to rozwiązać przez:

  • stworzenie nowej klasy dla rysunku, jednak podczas działania wyświetlało komunikat o braku możliwość dodania drugiego obrazka do tej samej listy co pierwszy.
  • pętle w paintComponent która sprawdzała jaki obrazek powinien być odrysowany(dawało to ten sam efekt co obecny tu kod)
  • stwożenie dwóch osobnych list

Może mi ktoś powiedzieć jak rozwiązać ten problem?


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;

public class img3 extends JFrame
{
    public img3()
    {
    init(); 
    }   

        void init(){

        //okno
        this.setTitle("img3");
        this.setBounds(400,300,500,400);
        this.setDefaultCloseOperation(3);

        //dodawanie do paska narzedzi
        pasekNarz.add(new Przyciski(new Wlasciwosci("Dodaj ruter", new ImageIcon("pic/ikony/iruter.gif"), RUTER )));
        pasekNarz.add(new Przyciski( new Wlasciwosci("Dodaj  hosta", new ImageIcon("pic/ikony/ihost.gif"), HOST)));
        pasekNarz.add(new Przyciski( new Wlasciwosci("Dodaj  switch", new ImageIcon("pic/ikony/iaccess_point.gif"), ACCESS_POINT)));
        pasekNarz.add(new Przyciski( new Wlasciwosci("Dodaj  switch", new ImageIcon("pic/ikony/iatm_switch.gif"), SWITCH)));

        //dodawanie do okna
        this.getContentPane().add(pasekNarz, BorderLayout.NORTH);
        this.getContentPane().add(panelRys, BorderLayout.CENTER);
        this.getContentPane().addMouseListener(new MouseAdapter()

{
            @Override
            public void mousePressed(MouseEvent arg0) 
            {
                // TODO Auto-generated method stub
                int x = arg0.getX();
                int y = arg0.getY();

                repaint();
            }

            @Override
            public void mouseReleased(MouseEvent arg0) 
            {
                // TODO Auto-generated method stub
                if( arg0.getButton() == MouseEvent.BUTTON1 && arg0.isControlDown() && Name != null)
                {
                System.out.println("clicked");
                int x = arg0.getX();
                int y = arg0.getY();
//tutaj dodaje do listy 
                                lista.add(new Ruter(x,y));
                repaint();
                System.out.println(lista.size());
                }

                if(arg0.getButton() == MouseEvent.BUTTON3 && arg0.isShiftDown() && lista.size() > 0)
                {
                System.out.println("clicked");
                lista.remove(lista.size()-1);
                repaint();
                System.out.println(lista.size());
                }       
            }           
        });
        panelRys.setBackground(Color.WHITE);
        panelRys.setDoubleBuffered(true);

    }

    class Wlasciwosci extends AbstractAction
    {

        public Wlasciwosci (String toolTip, Icon icon, String actionCommand)
        {
            this.putValue(Action.SHORT_DESCRIPTION, toolTip);
            this.putValue(Action.SMALL_ICON, icon);
            this.putValue("Akcja", actionCommand);      
        }

        @Override
        public void actionPerformed(ActionEvent arg0) 
        {
            // TODO Auto-generated method stub      
        }   
    }

    private class Przyciski extends JButton
    {
        public Przyciski(final Wlasciwosci wlas )
        {
            super(wlas);
            this.addActionListener(new ActionListener()
            {
                @Override
                public void actionPerformed(ActionEvent e)
                {
                    // TODO Auto-generated method stub
                    Name = (String) wlas.getValue("Akcja");
                    System.out.println(Name);
                }           
            });
        }
    }

    static final private String RUTER = "ruter";
    static final private String HOST = "host";
    static final private String SWITCH = "swith";
    static final private String ACCESS_POINT = "access_point";

    static String Name = null;
    JButton usun = new JButton("Usun");
    JToolBar pasekNarz = new JToolBar();
    ArrayList lista = new ArrayList();
    private PanelRys panelRys = new PanelRys();

    public static void main(String[] args)
    {
        new img3().setVisible(true);
    }

    class PanelRys extends JPanel  
    {
        public void panelRys()
        {

        }
//rysowanie     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);

            for(int i = 0; i < lista.size(); i++)
            {           
                g.drawImage(Ruter.getRuter(), ((Ruter)lista.get(i)).x, ((Ruter)lista.get(i)).y, null);

            }       
        }
    }
    static class Ruter 
    {
        int x;
        int y; 
        static Image name;

        public Ruter(int x2, int y2)
        {
            this.x = x2;
            this.y = y2;

            System.out.println(""+x);
            System.out.println(""+y);   
        }

        public static Image getRuter()
        {
            if (Name == RUTER){
                name = ruter;
            } else if (Name == SWITCH){
                name = swith;
            }
            return name;
        }
        public final static Image ruter = new ImageIcon("pic/ruter.gif").getImage();
        public final static Image swith = new ImageIcon("pic/switch.gif").getImage();
        public final static Image host = new ImageIcon("pic/host.gif").getImage();
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0