Questa è la classe dove disegno le mie JLabel
codice:
public class MiddlePanel extends JPanel implements MouseListener,MouseMotionListener{
int x0,y0,startx0,starty0,
preferedWidth = getWidth(),
preferedHeight = getHeight();
boolean out, //Indica se il cursore è fuori dalla finestra
drag, //Indica se il cursore è trascinato
butgateact; //Indica se è stato attivato un pulsante porta della toolbar
Image imgtmp;
ImageIcon imgicontmp;
private Point corner1 = new Point(0,0);
private Point corner2 = new Point(0,0);
ArrayList<JGateLabel> gate = new ArrayList();
public MiddlePanel(){
LayoutManager overlay = new OverlayLayout(this) {
@Override
public void layoutContainer(Container target) {
int nChildren = target.getComponentCount();
for (int i = 0; i < nChildren; i++){
Component c = target.getComponent(i);
c.setBounds(c.getLocation().x, c.getLocation().y,
c.getPreferredSize().width, c.getPreferredSize().height);
}
}
};
setMaximumSize(new Dimension(800,600));
setLayout(overlay);
addMouseListener(this);
addMouseMotionListener(this);
setBackground(Color.white);
}
//Un metodo che restituisce se non c'è il rischio di sovrappore i componenti figlio
@Override
public boolean isOptimizedDrawingEnabled() {
return false;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.LIGHT_GRAY);
paintGateTmp(g);
paintGrid(g);
paintSelection(g);
}
//Serve per creare un rettangolo per selezionare i componenti
public void paintSelection(Graphics g){
int x = Math.min(corner1.x,corner2.x);
int y = Math.min(corner1.y,corner2.y);
int width = Math.abs(corner1.x - corner2.x);
int height = Math.abs(corner1.y - corner2.y);
g.setColor(Color.CYAN);
g.drawRect(x, y, width, height);
g.setColor(Color.BLUE);
g.fillRect(x+1, y+1, width-1, height-1);
}
//Disegna la porta
public void paintGateTmp(Graphics g){
if(butgateact){
g.drawImage(imgtmp,x0-24,y0-24,this);
g.setColor(Color.DARK_GRAY); //Cambia il colore della griglia momentaneamente
}
}
//Disegna la griglia
public void paintGrid(Graphics g){
for(int i=0; i<getWidth() || i<getHeight(); i+=20) {
g.drawLine(i,0,i,getHeight());
g.drawLine(0,i,getWidth(),i);
}
}
//Crea una porta passando l'immagine temporanea utilizzata, la posizione del mouse, è una costante passata dal core (Da sistemare)
public JGateLabel createGate(MouseEvent e){
JGateLabel Jglbl = new JGateLabel(imgicontmp,e,0);
refresh(Jglbl,e);
add(Jglbl);
return Jglbl;
}
//Refrescia quando l'oggetto è una JGateLabel (o un JLineLabel)
public void refresh(JGateLabel j,MouseEvent e){
refreshGrid(j);
moveScroolBar(e.getPoint(),j);
revalidate();
repaint();
}
//Muove la scroll bar solo se il cursore è fuori dal Frame
public void moveScroolBar(Point p,JGateLabel c){
if(!LCE01.Grafica.Split.onScreen(c) && LCE01.Grafica.Split.MP.out){
LCE01.Grafica.Split.mySetJViewport(this,MouseInfo.getPointerInfo().getLocation(),c);
}
}
//Aggiorna la griglia, estendola (farla ridurre se necessario da sistemare)
public void refreshGrid(JLabel j){
if((j.getX()+j.getIcon().getIconWidth())>preferedWidth) preferedWidth = j.getX()+j.getIcon().getIconWidth();
if((j.getY()+j.getIcon().getIconHeight()>preferedHeight)) preferedHeight = j.getY()+j.getIcon().getIconHeight();
setPreferredSize(new Dimension(preferedWidth,preferedHeight));
}
//Si potrebbe creare una lista di coordianate x e y di ogni label in ordine decrescente così da evitare di fare una ricerca su tutti i componenti
public Dimension searchSizeGrid(){
int x = getWidth();
int y = getHeight();
for(int i=0;i<gate.size();i++){
if(x<gate.get(i).getX())
x = gate.get(i).getX();
if(y<gate.get(i).getY())
y = gate.get(i).getY();
}
return new Dimension(x,y);
}
@Override
public void mouseClicked(MouseEvent e) {
if(butgateact)
gate.add(createGate(e));
drag = false;
startx0 = 0;
starty0 = 0;
butgateact = false;
imgtmp = null;
imgicontmp = null;
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
repaint();
}
@Override
public void mousePressed(MouseEvent e) {
corner1 = e.getPoint();
corner2 = corner1;
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
corner1 = e.getPoint();
corner2 = corner1;
repaint();
}
@Override
public void mouseEntered(MouseEvent e) {
out = false;
repaint();
}
@Override
public void mouseExited(MouseEvent e) {
out = true;
repaint();
}
@Override
public void mouseDragged(MouseEvent e) {
corner2 = e.getPoint();
drag = true;
repaint();
}
@Override
public void mouseMoved(MouseEvent e) {
x0 = e.getX();
y0 = e.getY();
drag = false;
repaint();
}
public void setImageTmp(Image i){
setCursor(new Cursor(Cursor.MOVE_CURSOR));
imgtmp = i;
imgicontmp = new ImageIcon(i);
butgateact = true;
}
}
E questa è la classe dove estendo la JLabel, che poi sono quelle che disegno nel panel...
codice:
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
public class JGateLabel extends JLabel{
public boolean out;
private int id;
public JGateLabel(ImageIcon i,MouseEvent e,int _id){
id = _id;
setIcon(i);
setBounds(e.getX()-24,e.getY()-24,getWidth(),getHeight());
setBorder(new BevelBorder(BevelBorder.LOWERED));
setLayout(null);
addMouseMotionListener(new MouseMotionAdapter() {
//Serve per trascinare la JLabel dove vuoi
@Override
public void mouseDragged(MouseEvent e) {
Component c = e.getComponent();
c.setLocation(c.getX()+e.getX(), c.getY()+e.getY());
LCE01.Grafica.Split.MP.refresh((JGateLabel)e.getSource(), e);
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent e){
out = false;
}
@Override
public void mouseExited(MouseEvent e){
out = true;
}
});
}
}