Conectando Componentes da Swing com Graphics2D [Resolvido]

Ola´

Estou fazendo uma aplicação, onde tenho diversos JPanel’s móveis dentro de outro JPanel.

Quero fazer uma linha, ligando um ao outro. Sem deixar lixo na interface

Oi,
você quer ligar um no outro, ou apenas separalos com bordas?!

Tchauzin!

Seria uma linha ligando os panels como num diagrama de classes por exemplo?

Isto mesmo!

Entendi… nunca fiz algo assim, mas creio que vc deva usa as cordenadas dos panels para setar as posições passadas ao metodo g.drawLine.

Axo que seria o caso de vc desenhar uma linha, e nos eventos de mouse (pressed, dragged) vc vai setando as posições x1 y1 e x2 y2 da linha…

imagine panel1 e panel2…

x1 = panel1.getX() + panel1.getWidth();
y1 = panel1.getY() + (panel1.getHeigth / 2);

x2 = panel2.getX();
y2 = panel2.getY() + (panel2.getHeigth / 2);

No seu JPanel que contém esses 2 panels e a linha, vc sobrescreve o metodo paintComponent() pra ele redesenhar a linha, de acordo com as novas coordenadas…

Exato, precisa se ater ao mouse dragged.

Achei na minha busca um código que serve faz isto. Vou editá-lo para se adaptar a minha necessidade.

Ele linka todos os componentes, mas nada que uma edição no fonte não resolva.

Bom proveito a todos :-))

[code]/*

package testes.ex5;
import bons2.Bloco;
import java.awt.;
import java.awt.event.
;
import java.awt.geom.;
import javax.swing.
;
import javax.swing.event.MouseInputAdapter;

public class LinkedComponents{
LinkedPanel parentPanel;
public LinkedComponents() {
parentPanel = new LinkedPanel();
parentPanel.setLayout(null);
Rectangle r = new Rectangle(75, 75, 125, 40);
for(int j = 0; j < 3; j++) {
addPanel(parentPanel, r, "Panel " + (j+1));
r.x += r.width/3 + 25;
r.y += r.height + 45;
}
PanelMover panelMover = new PanelMover(parentPanel);
parentPanel.addMouseListener(panelMover);
parentPanel.addMouseMotionListener(panelMover);
}

private void addPanel(Container c, Rectangle bounds, String id){
    JPanel panel = new JPanel();
    c.add(panel);
    panel.setBounds(bounds);
    panel.add(new JLabel(id, JLabel.CENTER));
    panel.setBorder(BorderFactory.createEtchedBorder());
}

private JPanel getContent() {
    return parentPanel;
}

public static void main(String[] args) {
    LinkedComponents test = new LinkedComponents();
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().add(test.getContent());
    f.setSize(400,400);
    f.setLocation(200,200);
    f.setVisible(true);
}

}

class LinkedPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Component[] c = getComponents();
for(int j = 0; j < c.length; j++) {
Point2D.Double p1 = getCenter(c[j]);
for(int k = j+1; k < c.length; k++) {
Point2D.Double p2 = getCenter(c[k]);
g2.draw(new Line2D.Double(p1, p2));
}
}
}
private Point2D.Double getCenter(Component c) {
Point2D.Double p = new Point2D.Double();
Rectangle r = c.getBounds();
p.x = r.getCenterX();
p.y = r.getCenterY();
return p;
}
}

class PanelMover extends MouseInputAdapter {
LinkedPanel panel;
Point offset = new Point();
int selectedIndex;
boolean dragging = false;
PanelMover(LinkedPanel panel) {
this.panel = panel;
}
public void mousePressed(MouseEvent e) {
Point p = e.getPoint(); // This way of identifying the target JPanel should work as
// long as the target is not focusable and does not contain
// any components that consume MouseEvents, eg, JTextField.

    Component[] c = panel.getComponents(); 
    for(int j = 0; j < c.length; j++) { 
        Rectangle r = c[j].getBounds();    
        if(r.contains(p)) {        
            offset.x = p.x - r.x;      
            offset.y = p.y - r.y;     
            selectedIndex = j;      
            dragging = true;    
            break;    
        }      
    }   
}   
public void mouseReleased(MouseEvent e) {  
    dragging = false;
}    
public void mouseDragged(MouseEvent e) {    
    if(dragging) { 
        int x = e.getX() - offset.x;   
        int y = e.getY() - offset.y;   
        panel.getComponent(selectedIndex).setLocation(x, y);  
        panel.repaint();  
    }  
}

}

[/code]

Acho que vou conseguir resolver meu problema com este código.

Um abraço a todos