Conectando Componentes da Swing com Graphics2D [Resolvido]

7 respostas
douglasrusso

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

7 Respostas

lina

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

Tchauzin!

Luiz_Aguiar

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

douglasrusso

Isto mesmo!

Luiz_Aguiar

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.

fabim

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…

Luiz_Aguiar

Exato, precisa se ater ao mouse dragged.

douglasrusso

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 :-))

/*
 
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();  
        }  
    }
}

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

Um abraço a todos

Criado 20 de março de 2007
Ultima resposta 20 de mar. de 2007
Respostas 7
Participantes 4