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