1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| public class LinkableInternalFrame extends JInternalFrame {
private JList maListe; // ou JTable, comme tu veux
private JScrollPane scrollPane;
...
/** returns true if this LIF should be linked with the specified one */
public boolean isLinkableWith(LinkableInternalFame other) {
...
}
/** returns the distance between the LIF's top and the link in pixels */
public int getLinkHeight(LinkableInternalFrame other) {
... // utilise SwingUtilities.convertPoint
}
/** allows external objects to listen to vertical scrolling, so that they
* can react to a change of the link height */
public void addAdjustmentListener(AdjustmentListener l) {
scrollPane.getVerticalScrollBar().addAdjustmentListener(l);
}
}
public class Link implements AdjustmentListener {
private LinkableInternalFrame frame1, frame2;
private int linkHeight1, linkHeight2;
// constructeur, getters et setters
// ne pas oublier d'appeler addAdjustmentListener(this)
// dans le constructeur !
/** update link heights */
public void adjustmentValueChanged(AdjustmentEvent e) {
// ça peut améliorer les performances : on ne réagit pas quand il y
// a pleins d'ajustements successifs (comme quand on fait glisser
// le thumb)
if(e.isValueAdjusting())
return;
LinkableInternalFrame lif = (LinkableInternalFrame)
SwingUtilities.getAncestorOfClass(
LinkableInternalFrame.class,
(Component) e.getSource() );
if(lif.equals(frame1))
linkHeight1 = frame1.getLinkHeight(frame2);
if(lif.equals(frame2))
linkHeight2 = frame2.getLinkHeight(frame1);
// on actualise le JDesktopPane
lif.getParent().repaint();
}
}
public class LinkerDesktopPane extends JDesktopPane {
private Collection<Link> links;
// on surcharge toutes les méthodes add(...) d'un coup
public void addImpl(Component comp, Object constraints, int index) {
// on ajoute de manière normale
super.addImpl(comp, constraints, index);
if(comp instanceof LinkableInternalFrame) {
LinkableInternalFrame lif = LinkableInternalFrame(comp);
for(Component c2 : getComponents()) {
if(c2 instanceof LinkableInternalFrame &&
(LinkableInternalFrame)c2.isLinkableWith(lif) )
links.add(new Link(...);
}
}
}
public void paint(Graphics g) {
super.paint(g);
paintLinks(g);
}
private void paintLinks(Graphics g) {
// a toi de jouer
}
} |
Partager