2012-02-11 17 views
10

Sto provando a disegnare una linea (linea rossa nell'immagine) su più pannelli, ma non riesco a farlo funzionare. Come posso renderlo possibile? Eventuali suggerimenti?Disegna linee su più pannelli in Java

Drawing of required functionality

+0

BTW - bella immagine, ma per favore li ritaglia più piccoli in futuro. Ho sostituito l'originale con una versione ritagliata (430 × 375 px). –

risposta

10

Disegnare sul glass pane.

+0

o su JViewPort +1 – mKorbel

+0

@mKorbel ehh ... il viewport (se presente) è _below_ il pannello ... – kleopatra

+0

personalmente, non capisco perfettamente i puntatori nudi del glassPane: è un (btw, difficile da gestire) proprietà di rootPane, ovvero figlio diretto di un contenitore di livello superiore. Allora, cosa sei (e altri di recente, oggi sei lo sfortunato :-)? Davvero un suggerimento: gestisci le sovrapressioni vitree su una base per frame? utilizzare un rootPane altrove? copia la parte del codice rootPane che sta gestendo il glassPane in un altro contenitore? Davvero curioso ... – kleopatra

5

JDK 7 aggiunto JLayer to support visual decorations sopra componenti arbitrari. Per le versioni precedenti, c'è il progetto JXLayer at java.net che in realtà è il suo predecessore con API molto simili

Ecco un esempio rudimentale, utilizzando un LayerUI personalizzato che disegna una linea retta da un componente in un contenitore a un altro componente in un contenitore diverso. Il genitore comune dei due contenitori è decorato con un JLayer usando quell'interfaccia utente:

JComponent comp = Box.createVerticalBox(); 
    final JComponent upper = new JPanel(); 
    final JButton upperChild = new JButton("happy in upper"); 
    upper.add(upperChild); 
    final JComponent lower = new JPanel(); 
    final JButton lowerChild = new JButton("unhappy in lower"); 
    lower.add(lowerChild); 
    comp.add(upper); 
    comp.add(lower); 
    LayerUI<JComponent> ui = new LayerUI<JComponent>() { 

     @Override 
     public void paint(Graphics g, JComponent c) { 
      super.paint(g, c); 
      Rectangle u = SwingUtilities.convertRectangle(upper, upperChild.getBounds(), c); 
      Rectangle l = SwingUtilities.convertRectangle(lower, lowerChild.getBounds(), c); 

      g.setColor(Color.RED); 
      g.drawLine(u.x, u.y + u.height, l.x, l.y); 
     } 

    }; 
    JLayer<JComponent> layer = new JLayer<JComponent>(comp, ui); 
+0

J (X) Layer è un codice molto utilizzabile +1 – mKorbel

Problemi correlati