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 [url]http://ermalaev.spb.ru/docs/books/tutorial/uiswing/components/table.html[/url]):
publicclassSimpleTableDemoextendsJPanel{privateColumnTableModel<String>model=null;publicSimpleTableDemo(){super(newGridLayout(1,0));model=getStringTableModel();finalJTabletable=newJTable(model);ocultColumns(table);getStringTableModel().add("Teste");table.setPreferredScrollableViewportSize(newDimension(500,70));table.setFillsViewportHeight(true);JScrollPanescrollPane=newJScrollPane(table);add(scrollPane);}privatestaticvoidcreateAndShowGUI(){JFrameframe=newJFrame("SimpleTableDemo");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);SimpleTableDemonewContentPane=newSimpleTableDemo();newContentPane.setOpaque(true);//content panes must be opaqueframe.setContentPane(newContentPane);frame.pack();frame.setVisible(true);}publicstaticvoidmain(String[]args){javax.swing.SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){createAndShowGUI();}});}publicvoidocultColumns(JTabletable){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);}privateColumnTableModel<String>getStringTableModel(){if(model==null){// Esse model se comporta como um arraylist! :)model=newColumnTableModel<String>(StringColumns.values());}returnmodel;}}
Nesse exemplo, a palavra "Teste" é escrita em todas as células da primeira linha.
seudito
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.
Muito obrigado Vini!!!
ViniGodoy
Sim, vc pode usar o TableFilter com qualquer model.