Bom dia pessoal,
Eu tive perguntando no forum como fazia pra selecionar objetos swing como botoes etc igual ao que se faz nas pastas de um sistema operacional. Como nao tinha nada pronto eu criei algo e gostaria de compartilhar com vocês e até mesmo receber sugestões/críticas de melhorias.
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Rectangle2D;
import java.util.Vector;
import javax.swing.*;
@SuppressWarnings("serial")
public class JKSSelect extends JComponent{
private Point point;
@SuppressWarnings("unused")
private JComponent component;
private Vector <Selectable> unselected;
private Vector <Selectable> selected;
@SuppressWarnings("unchecked")
public JKSSelect(JComponent component, Vector <? extends Selectable> selection){
super();
this.component = component;
this.unselected = (Vector<Selectable>) selection;
this.selected = new Vector <Selectable> ();
this.containerAction(component);
point = new Point();
this.setBorder(BorderFactory.createTitledBorder(""));
component.addContainerListener(new ContainerAdapter(){
@Override
public void componentAdded(ContainerEvent e) {
if(e.getChild() instanceof Selectable){
e.getChild().addMouseListener(new JKSClick());
}
}
});
}
private void makeSquare(Point a, Point b){
Point aux;
if(a == null || b == null){
a = new Point(0,0);
b = new Point(0,0);
}
if(a.x == 0 && a.y == 0 && b.x == 0 && b.y == 0){
this.setLocation(0,0);
this.setSize(0,0);
}
if((a.x>=b.x && a.y>b.y) || (a.x<b.x && a.y>=b.y)){
aux = a;
a = b;
b = aux;
}
if(a.x<=b.x && a.y<b.y){
this.setLocation((int) (a.x),(int) (a.y));
this.setSize((int) (b.x-a.x),(int) (b.y-a.y));
}else if(a.x>b.x && a.y<=b.y){
this.setLocation((int) (b.x),(int) (a.y));
this.setSize((int) (a.x-b.x),(int) (b.y-a.y));
}
}
public void containerAction(JComponent container){
container.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent arg0) {
unselectAll();
}
@Override
public void mousePressed(MouseEvent arg0) {
if(!arg0.isControlDown()) unselectAll();
point = arg0.getPoint();
setVisible(true);
}
@Override
public void mouseReleased(MouseEvent arg0) {
setVisible(false);
for(int x = 0; x < unselected.size(); x++){
if((new Rectangle2D.Double(getLocation().getX(),getLocation().getY(),getSize().getWidth(),getSize().getHeight())).contains(unselected.get(x).getLocation())){
unselected.get(x).setSelected(true);
selected.add(unselected.remove(x));
x--;
}
}
makeSquare(new Point(0,0), new Point(0,0));
}
});
container.addMouseMotionListener(new MouseMotionAdapter(){
@Override
public void mouseDragged(MouseEvent arg0) {
makeSquare(point, arg0.getPoint());
}
});
}
public void unselectAll() {
while(selected.size() != 0){
selected.get(0).setSelected(false);
unselected.add(selected.remove(0));
}
}
public void selectAll() {
while(unselected.size() != 0){
unselected.get(0).setSelected(true);
selected.add(unselected.remove(0));
}
}
public Vector <? extends Selectable> getSelectedArray(){
return this.selected;
}
public Vector <? extends Selectable> getUnselectedArray(){
return this.unselected;
}
class JKSClick extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
System.out.printf("Clicado");
if(!e.isControlDown())unselectAll();
if(selected.remove((Selectable)e.getComponent())){
unselected.add((Selectable)e.getComponent());
((Selectable)e.getComponent()).setSelected(false);
}else if(unselected.remove((Selectable)e.getComponent())){
selected.add((Selectable)e.getComponent());
((Selectable)e.getComponent()).setSelected(true);
}
}
}
}
Os obetos passiveis de serem selecionados devem implementar esta interface:
import javax.accessibility.AccessibleComponent;
public interface Selectable extends AccessibleComponent{
public void setSelected(boolean selected);
public boolean isSelected();
}
Veja como usar:
select = new JKSSelect(panel,panel.getSelectableItens());
panel.add(select);
O construtor da classe JKSSelect recebe o painel em que ocorrerá a seleção e recebe o vetor de itens selecionáveis.
A classe permite seleção usando o retângulo de seleção, usando o click individual de cada item e seleção em partes utilizando a tecla ctrl.
