Em Java Swing como você pode gerenciar uma lista de painéis permitindo que vários painéis a serem selecionados?
Pergunta
Eu estou trabalhando em um aplicativo in-house que acompanha um grupo de tarefas. Eu queria ter um monitor de tarefa simples que iria listar o nome da tarefa e status da tarefa. Eu preciso disso para olhar apenas um pouco de bom, eu não sou designer assim que o que eu faço é ir para sugar, mas um display de texto básico não vai funcionar para os requisitos do projeto.
O que estou tentando essencialmente fazer é mostrar algo semelhante a janela de download do Firefox, a janela de download do I-Tunes, e bem que eu poderia citar mais, mas todos eles parecem basicamente o mesmo. Em cada um desses aplicativos, cada um dos painéis de progresso "é selecionável. Assim, para implementar isso eu pensei que seria simples de usar apenas uma lista de JPanels cada um com uma JProgressBar e um JLabel, cada um dos quais pode apenas aceitar o foco para determinar se ele e os outros são selecionados. Eu pensei que este ia ser uma tarefa fácil, mas se eu usar um JList ele apenas exibe texto. então eu percebi que eu iria mostrar todos os painéis de tarefas em um painel maior, mas eu não posso obter os painéis internos para reconhecer o foco.
Existe um padrão para isso? Existe uma solução padrão rolou que eu simplesmente não ter encontrado? Ou há um método melhor para fazer isso? Eu não quero reinventar a roda, mas eu pensei que este foi apenas vai ser simples.
Solução
Parece que você pode estar procurando é uma JList
.
Você pode adicionar seus itens para o JList
de pelo primeiro adicionando seu "tarefa" para o objeto JList
ListModel
(veja o seção Criar um Modelo com os tutoriais de Java), e então você vai querer atribuído um costume ListCellRenderer
que irá aceitar a sua 'missão' e tornar a JList
como um JPanel
na própria lista. A chave aqui é fazer o seu ListCellRenderer
costume ser capaz de exibir a sua "tarefa" no JList
a maneira que você quiser tê-lo mostrar na JList
.
Dê uma olhada na escrever um renderizador de célula personalizado seção dos Como usar listas página dos tutoriais Java. Ele irá descrever como fazer o seu ListCellRenderer
personalizado para que possa representar sua "tarefa" como qualquer coisa que você quiser.
Para mantê-lo curto, você vai implementar o ListCellRenderer
Interface implementando a getListCellRendererComponent
que retornará a Component
que é a representação de sua tarefa na JList
. Você provavelmente vai querer quer construir ou instanciar o seu JPanel
neste método e devolvê-lo como o Component
.
Outras dicas
A maneira padrão de fazer este tipo de coisas é usar JTable (ou JList) como um recipiente.
Você não tem que usar renderes padrão fot células da tabela, mas você pode especificar o seu próprio representante para células específicas. Dê uma olhada na CellRenderer
Como cerca de um JTable
(que você pode definir para permitir várias linhas a serem selecionados) com um JPanel
interna ocupando a única célula em cada linha, que contém uma JProgressBar
e uma JLabel
. Ou você poderia usar um JList
com a mesma estrutura que acabei de descrever.