package demo.d7; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.border.EmptyBorder; import javax.swing.JProgressBar; import javax.swing.SwingConstants; import javax.swing.JLabel; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.util.ArrayList; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * Graafinen astia * @author vesal * @version 12.2.2011 */ public class GraafinenAstia extends JPanel implements Astia.MaaraMuuttuu { private static final long serialVersionUID = 1L; private final JProgressBar barAstia = new JProgressBar(); private Astia astia; private double maxkoko = 20; private boolean selected = false; private Color selectedColor = Color.blue; private final JPanel panel = new JPanel(); private final JLabel labelNimi = new JLabel("\u00E4"); private final ArrayList astiaClickedListenerList = new ArrayList(); /** * Rajapinta astian klikkauksen kuuntelijoille * @author vesal * @version 6.2.2011 */ public static interface AstiaClickedListener { /** * Metodi jota kutsutaan kun astiaa klikataan * @param klikattuAstia jota klikattiin */ public void clicked(GraafinenAstia klikattuAstia); } /** * Alustetaan graafinen astia. */ public GraafinenAstia() { addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { klikattu(); } }); addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { tutkiKoko(); } }); astia = new Astia("ä", 10); setBorder(new EmptyBorder(0, 20, 0, 20)); setLayout(new BorderLayout(0, 0)); add(panel, BorderLayout.CENTER); panel.setLayout(new BorderLayout(0, 0)); panel.add(barAstia, BorderLayout.SOUTH); barAstia.setString("5"); barAstia.setStringPainted(true); barAstia.setValue(70); barAstia.setOrientation(SwingConstants.VERTICAL); labelNimi.setOpaque(true); labelNimi.setHorizontalAlignment(SwingConstants.CENTER); add(labelNimi, BorderLayout.SOUTH); tutkiKoko(); } protected void tutkiKoko() { int hm = getSize().height - labelNimi.getSize().height; if ( hm == 0 ) return; double sy = hm / getMaxSize(); Dimension koko = new Dimension(15, (int)(sy * astia.getTilavuus())); barAstia.setPreferredSize(koko); barAstia.setVisible(false); // jostakin syystä ei tottele kokoa ilman tätä??? barAstia.setVisible(true); } /** * @return suurimman astian koko */ public double getMaxSize() { return maxkoko; } /** * Suurimman astian koko määrää muiden astioiden suhteellisen koon * @param maxSize mikä on suurimman astian koko */ public void setMaxSize(double maxSize) { this.maxkoko = maxSize; tutkiKoko(); } /** * @return the selected */ public boolean isSelected() { return selected; } /** * @param selected the selected to set */ public void setSelected(boolean selected) { this.selected = selected; if ( selected ) labelNimi.setBackground(selectedColor); else labelNimi.setBackground(getBackground()); } /** * @return astia jota näytetään */ public Astia getAstia() { return astia; } /** * Asetetaan näytettävä astia * @param astia jota näytetään */ public void setAstia(Astia astia) { this.astia = astia; barAstia.setMaximum((int)astia.getTilavuus() * 100); tutkiKoko(); muutos(astia); labelNimi.setText(astia.getNimi()); astia.addMaaraMuuttuuListener(this); } @Override public void muutos(Astia a) { barAstia.setValue((int)a.getMaara() * 100); barAstia.setString(""+a.getMaara()); tutkiKoko(); } /** * Lisätään kuuntelija kuuntelemaan astian klikkausta * @param listener uusi kuuntelija */ public void addAstiaClickedListener(AstiaClickedListener listener) { astiaClickedListenerList.add(listener); } /** * Komponettia on klikattu */ protected void klikattu() { for (AstiaClickedListener listener : astiaClickedListenerList) listener.clicked(this); } }