Estou fazendo alguns testes com JTable, e consegui fazer com que ao clicar no header do JTable, seja exibido um menu de contexto com algumas opções. Os itens deste menu são JCheckBoxMenuItem (uma série deles…).
Problema: ao selecionar um checkbox, o menu é fechado automaticamente, sendo necessário clicar mais uma vez no header para exibir o menu e então marcar (ou desmarcar) outra opção.
É possivel manter esse JPopUpMenu aberto até que todas as opções sejam escolhidas :?:
Obs: O objetivo final com tudo isso é elaborar um auto-filtro semelhante ao do Excel.
Quando add uma String, a mesma String é add na linha toda. Nos outros testes que eu havia feito, passava um Object[][] para o modelo para povoar a tabela. Como posso alterar isso? Segue o código que estou testando (adaptado de http://ermalaev.spb.ru/docs/books/tutorial/uiswing/components/table.html):
[code]public class SimpleTableDemo extends JPanel{
private ColumnTableModel<String> model = null;
public SimpleTableDemo() {
super(new GridLayout(1,0));
model = getStringTableModel();
final JTable table = new JTable(model);
ocultColumns(table);
getStringTableModel().add("Teste");
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SimpleTableDemo newContentPane = new SimpleTableDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public void ocultColumns(JTable table){
table.getColumnModel().getColumn( 5 ).setMaxWidth( 0 );
table.getColumnModel().getColumn( 5 ).setMinWidth( 0 );
table.getTableHeader().getColumnModel().getColumn( 5 ).setMaxWidth( 0 );
table.getTableHeader().getColumnModel().getColumn( 5 ).setMinWidth( 0 );
table.getColumnModel().getColumn( 6 ).setMaxWidth( 0 );
table.getColumnModel().getColumn( 6 ).setMinWidth( 0 );
table.getTableHeader().getColumnModel().getColumn( 6 ).setMaxWidth( 0 );
table.getTableHeader().getColumnModel().getColumn( 6 ).setMinWidth( 0 );
}
private ColumnTableModel<String> getStringTableModel() {
if (model == null) {
// Esse model se comporta como um arraylist! :)
model = new ColumnTableModel<String>(StringColumns.values());
}
return model;
}
}[/code]
Nesse exemplo, a palavra “Teste” é escrita em todas as células da primeira linha.
Pensei que fosse necessário implementar este mesmo modelo para que o filtro funcionasse, mas olhando com mais atenção percebi que era possivel implementar o filtro utilizando o mesmo modelo que eu ja havia testando.