Hi everybody,
I need to
select and drag multiple components (Eg. JLabels)
at once, it is quite simple to manage just one drag at a time but how can be managed a multiple drag?
I mean something like Windows files selection mechanism : using Ctrl + Left mouse click to select the components and then start dragging them all to the drop target.
Beneath the code I'm using for testing , clicking and dragging each JLabel to JTextField just cause the copy of JLabel text to the JTextField contents.
In the sample a left click on each displayed label sets a border just to identify the selected status of the labels to drag but there's no implementation of the drop mechanism that should copy all the selected JLabels text to the drop target (the JTextField).
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.TransferHandler;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
public class SelectableJLabel extends JPanel {
MouseListener listener = new DragMouseAdapter();
public Border getBorder(boolean getSelectedBorder) {
Border outsideBorder = BorderFactory.createEmptyBorder(2,2,2,2);
Border insideBorder = BorderFactory.createEmptyBorder(2,2,2,2);
if (getSelectedBorder)
insideBorder = BorderFactory.createEtchedBorder();
return BorderFactory.createCompoundBorder(outsideBorder, insideBorder);
}
private class DragMouseAdapter extends MouseAdapter {
public void mousePressed(MouseEvent e) {
System.out.println("Press!");
JComponent c = (JComponent) e.getSource();
JLabel lbl = (JLabel)c;
if (lbl.getBorder()==null || ((CompoundBorder)lbl.getBorder()).getInsideBorder() instanceof EmptyBorder) {
lbl.setBorder(getBorder(true));
TransferHandler handler = c.getTransferHandler();
handler.exportAsDrag(c, e, TransferHandler.COPY);
} else
lbl.setBorder(getBorder(false));
}
/* (non-Javadoc)
* @see java.awt.event.MouseAdapter#mouseClicked(java.awt.event.MouseEvent)
*/
@Override
public void mouseClicked(MouseEvent e) {
}
}
public JLabel getSelectableLabel() {
JLabel selectableJLabel = new JLabel("You can't select me");
selectableJLabel.setBorder(getBorder(false));
selectableJLabel.setTransferHandler(new TransferHandler("text"));
selectableJLabel.addMouseListener(listener);
return selectableJLabel;
}
public SelectableJLabel() {
// a regular JLabel
add(getSelectableLabel());
add(getSelectableLabel());
add(getSelectableLabel());
// a look-alike JLabel
JTextField f = new JTextField("You can select me........................");
f.setDragEnabled(true);
//f.setEditable(false);
f.setBorder(null);
f.setForeground(UIManager.getColor("Label.foreground"));
f.setFont(UIManager.getFont("Label.font"));
add(f);
}
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
public static void main(String s[]) {
JFrame frame = new JFrame("SelectableJLabel");
SelectableJLabel panel = new SelectableJLabel();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel, "Center");
frame.setSize(panel.getPreferredSize());
frame.setVisible(true);
}
}
Tnx in advance for HELP
Massimo
Edited by: JKut on May 2, 2010 10:48 AM