Cześć.
Napisałem program do obsługi ZOO z użyciem OSGI. W programie znajdują się dwie klatki oraz 3 zwierzęta. W momencie usunięcia jednej klatki, zwierzęta powinny być przerzucane do drugiej ( pod warunkiem, że jest w niej miejsce). I tu pojawia się problem. Program w momencie usunięcia klatki, usuwa wszystkie zwierzęta w niej będące. Jestem w kropcem i nie mogę rozwiązać tego problemu, dlatego proszę o pomoc.
Z góry dzięki:
Menadżer:
package org.foo.zoo.main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.swingutils.SwingUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;
import javax.swing.*;
import javax.swing.JFrame;
public class ZooManager extends JFrame {
private JPanel panel;
private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
private Map<String, SimpleCage> cages = Collections.synchronizedMap(new HashMap<String, SimpleCage>());
private List<JButton> buts = new ArrayList<JButton>();
public ZooManager(){
super("Zoo");
GridLayout nLayout = new GridLayout(4,4,10,10);
panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setLayout(nLayout);
panel.setMinimumSize(new Dimension(400, 400));
setSize(420, 420);
add(panel);
JButton b = new JButton("Pokaż stan wszystkich");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Object src = evt.getSource();
CageState cs = new CageState(cages);
}
});
panel.add(b);
setVisible(true);
}
void addCage(SimpleCage cage, Map<String,?> attrs){
//System.out.print(ani.SayHello());
final String name = (String)attrs.get(SimpleCage.NAME_PROPERTY);
cages.put(name, cage);
JOptionPane.showMessageDialog(null, "Dodano: " + name);
SwingUtils.invokeAndWait(new Runnable() {
@Override
public void run() {
JButton butt = new JButton(name);
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource();
String name = ((JButton)src).getText();
cages.get(name).Show(true);
}
});
buts.add(butt);
panel.add(butt);
panel.validate();
repaint();
}
});
}
void removeCage(SimpleCage cage,Map<String,?> attrs){
final String name = (String)attrs.get(SimpleCage.NAME_PROPERTY);
cages.remove(name);
SwingUtils.invokeAndWait(new Runnable() {
@Override
public void run() {
panel.remove(getButton(name));
panel.validate();
repaint();
}
});
List<SimpleAnimal> remove = new LinkedList<SimpleAnimal>();
for (Entry<String, SimpleAnimal> ae : cage.GetAnimals().entrySet())
{
Map<String, String> animalAttrs = new HashMap<String, String>();
animalAttrs.put(SimpleAnimal.NAME_PROPERTY, ae.getKey());
for (Entry<String, SimpleCage> e : cages.entrySet())
{
if (e.getValue().addAnimal(ae.getValue(), animalAttrs))
break;
}
// if we are here remove from zoo, because no space in cages (stop bundle)
try
{
FrameworkUtil.getBundle(ae.getValue().getClass()).stop();
JOptionPane.showMessageDialog(null, "Wyrzucono " + ae.getKey() + " z ZOO z powodu braku miejsc.");
}
catch (BundleException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private JButton getButton(String name){
for(JButton b : buts){
if(b.getText().equalsIgnoreCase(name)){
return b;
}
}
return null;
}
}
Duża klatka
package org.foo.zoo.bigcage;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.animaljanitor.AnimalJanitor;
import org.foo.zoo.swingutils.SwingUtils;
public class BigCage extends JFrame implements SimpleCage {
private final int size = 5;
private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
private JPanel panel;
private List<JButton> buts = new ArrayList<JButton>();
public BigCage()
{
super("Big cage");
GridLayout nLayout = new GridLayout(4,4,10,10);
panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setLayout(nLayout);
panel.setMinimumSize(new Dimension(400, 400));
setSize(420, 420);
add(panel);
show(false);
}
@Override
public Map<String, SimpleAnimal> GetAnimals() {
// TODO Auto-generated method stub
return animals;
}
@Override
public boolean addAnimal(final SimpleAnimal animal, Map<String, ?> attrs) {
// TODO Auto-generated method stub
if (animals.size() >= size)
return false;
if (animal.GetState() != AnimalState.UNCAGED)
return false;
final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
animal.SetState(AnimalState.CAGED);
SwingUtils.invokeAndWait(new Runnable()
{
@Override
public void run()
{
JButton butt = new JButton(name);
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Object src = evt.getSource();
AnimalJanitor aj = new AnimalJanitor(animal);
}
});
buts.add(butt);
panel.add(butt);
panel.validate();
repaint();
}
});
return animals.put(name, animal) == null;
}
@Override
public boolean removeAnimal(SimpleAnimal animal, Map<String, ?> attrs) {
// TODO Auto-generated method stub
final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
SimpleAnimal ani = animals.remove(name);
if (ani == null)
return false;
if (animal == null)
animal = ani;
animal.SetState(AnimalState.UNCAGED);
SwingUtils.invokeAndWait(new Runnable() {
@Override
public void run() {
panel.remove(getButton(name));
panel.validate();
repaint();
}
});
return true;
}
@Override
public void Show(boolean show) {
// TODO Auto-generated method stub
this.setVisible(show);
}
private JButton getButton(String name){
for(JButton b : buts){
if(b.getText().equalsIgnoreCase(name)){
return b;
}
}
return null;
}
@Override
public String GetState() {
return "Big Cage " + animals.size() + "/" + size;
}
@Override
public boolean HasSlotForAnimal() {
// TODO Auto-generated method stub
return animals.size() < size;
}
}
Mała klatka
package org.foo.zoo.smallcage;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.animaljanitor.AnimalJanitor;
import org.foo.zoo.swingutils.SwingUtils;
import org.osgi.framework.FrameworkUtil;
public class SmallCage extends JFrame implements SimpleCage {
private final int size = 1;
private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
private JPanel panel;
private List<JButton> buts = new ArrayList<JButton>();
public SmallCage()
{
super("Small cage");
GridLayout nLayout = new GridLayout(4,4,10,10);
panel = new JPanel();
panel.setBackground(Color.WHITE);
panel.setLayout(nLayout);
panel.setMinimumSize(new Dimension(400, 400));
setSize(420, 420);
add(panel);
for (final String key : animals.keySet())
{
final SimpleAnimal animal = animals.get(key);
SwingUtils.invokeAndWait(new Runnable()
{
@Override
public void run()
{
JButton butt = new JButton(key);
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Object src = evt.getSource();
AnimalJanitor aj = new AnimalJanitor(animal);
}
});
//buts.add(butt);
panel.add(butt);
panel.validate();
repaint();
}
});
}
show(false);
}
@Override
public Map<String, SimpleAnimal> GetAnimals() {
// TODO Auto-generated method stub
return animals;
}
@Override
public boolean addAnimal(final SimpleAnimal animal, Map<String, ?> attrs) {
// TODO Auto-generated method stub
if (animals.size() >= size)
return false;
if (animal.GetState() != AnimalState.UNCAGED)
return false;
final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
animal.SetState(AnimalState.CAGED);
SwingUtils.invokeAndWait(new Runnable()
{
@Override
public void run()
{
JButton butt = new JButton(name);
butt.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Object src = evt.getSource();
AnimalJanitor aj = new AnimalJanitor(animal);
}
});
buts.add(butt);
panel.add(butt);
panel.validate();
repaint();
}
});
return animals.put(name, animal) == null;
}
@Override
public boolean removeAnimal(SimpleAnimal animal, Map<String, ?> attrs) {
// TODO Auto-generated method stub
final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
if (animals.remove(name) == null)
return false;
animal.SetState(AnimalState.UNCAGED);
SwingUtils.invokeAndWait(new Runnable() {
@Override
public void run() {
panel.remove(getButton(name));
panel.validate();
repaint();
}
});
return true;
}
@Override
public void Show(boolean show) {
// TODO Auto-generated method stub
this.setVisible(show);
}
private JButton getButton(String name){
for(JButton b : buts){
if(b.getText().equalsIgnoreCase(name)){
return b;
}
}
return null;
}
@Override
public String GetState() {
// TODO Auto-generated method stub
return "Small Cage " + animals.size() + "/" + size;
}
@Override
public boolean HasSlotForAnimal() {
// TODO Auto-generated method stub
return animals.size() < size;
}
}