Ja sam svojevremeno napravio gomilu takvih komponenti (JavaBeans) dok sam radio na jednom projektu - CPU simulator gde je bilo dosta crtanja, pa mi je ovo drasticno olaksalo posao. Prakticno sam onda mogao indijancima da dam da mi crtaju maske, a ja samo pisem logiku :D
Evo iscupao sam jedan primer ExIli kolo:
Code:
package beans.komb.exili;
import java.awt.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class ExiliDesno extends JPanel {
Image image;
public ExiliDesno() {
setLayout(null);
try {
image = ImageIO.read(new File("slike" + File.separator + "exili", "exili_desno.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (image == null) return;
g2.drawImage(image, 0, 0, null);
}
public Dimension getPreferredSize() {
return new Dimension(XPREFSIZE, YPREFSIZE);
}
private static final int XPREFSIZE = 40;
private static final int YPREFSIZE = 34;
}
Code:
package beans.komb.exili;
import java.awt.Image;
import java.beans.BeanInfo;
import java.beans.SimpleBeanInfo;
public class ExiliDesnoBeanInfo extends SimpleBeanInfo {
public Image getIcon(int iconType)
{
String name = "";
if (iconType == BeanInfo.ICON_COLOR_16x16) name = "16";
else if (iconType == BeanInfo.ICON_COLOR_32x32) name = "32";
else if (iconType == BeanInfo.ICON_MONO_16x16) name = "16";
else if (iconType == BeanInfo.ICON_MONO_32x32) name = "32";
else return null;
return loadImage("exili_desno_" + name + ".png");
}
}
Vise takvih komponenti je spakovano u jar u kome se nalaze klase i slike koje su potrebno. A ju korenu jara imas nesto ovako Exili.mf:
Code:
Manifest-Version: 1.0
Name: beans/komb/exili/ExiliDesno.class
Java-Bean: True
Name: beans/komb/exili/ExiliLevo.class
Java-Bean: True
Name: beans/komb/exili/ExiliGore.class
Java-Bean: True
Name: beans/komb/exili/ExiliDole.class
Java-Bean: True
Naravno, komponenta moze biti i komplikovanija (ima logiku), evo na primer linije (jedan bit):
Code:
package beans.shapes;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import alatke.SwingAlatke;
public class LinijaHor extends JLabel {
Color boja = Color.BLUE; // default je neaktivna
private static final int XPREFSIZE = 100;
private static final int YPREFSIZE = 7;
public LinijaHor() {
setBackground(Color.WHITE);
setText(null);
}
public void oboji(boolean aktivna) {
boja = aktivna ? Color.RED : Color.BLUE;
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
// Uključi antialiasing!
// SwingAlatke.antiAliasingOn(g2);
g2.setColor(boja);
g2.draw(new Line2D.Double(0, getSize().getHeight() * 0.5, getSize().getWidth(), getSize().getHeight() * 0.5));
}
public Dimension getPreferredSize() {
return new Dimension(XPREFSIZE, YPREFSIZE);
}
}