Classe pronta pra selecionar

9 respostas
tabocu

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.

9 Respostas

tabocu

Por favor, se alguem vir a usar isso deixe sua opnião e, se possível, erros encontrados

Marky.Vasconcelos

Como assim? Explique melhor o que essa classe faz e como funciona essa parte.

ViniGodoy

E por que você usa Vector, e não ArrayList?
http://www.guj.com.br/java/74068-nao-use-vector-use-list#389435

tabocu

Essa classe vem pronta pra que vc possa selecionar objetos que extendem Jcomponent igual o que vc faz com icones na sua área de trabalho
ela possui dois vetores: de selecionados e nao selecionados. assim vc pode selecionar alguns objetos.

Marky.Vasconcelos

Voce podia mostrar um aplicativo de exemplo com isso funcionando para darmos uma olhada.

ViniGodoy

Ficou bem bacana. Eu só trocaria o Vector por List, como já comentei.

Faltou postar o código da interface Selectable também.

tabocu

Como posso postar o programa?

Viny, obrigado pela dica, vou fazer a alteração assim que eu tiver tempo. Devo fazer hj ainda.

Quanto a interfece, olhe de novo. Ela ta la sim

tabocu
import javax.accessibility.AccessibleComponent;

public interface Selectable extends AccessibleComponent{
	public void setSelected(boolean selected);
	public boolean isSelected();
}
tabocu

Ai gente, esse programinha tem um exemplo de uso de select. Como o programa em si ta meio bagunçado muitas coisas nele nao funciona
e o botao pra deletar nao deleta, ele conecta.

Porem da pra visualizar o select

Criado 18 de janeiro de 2011
Ultima resposta 18 de jan. de 2011
Respostas 9
Participantes 3