Reputation: 153
I have a JDialog where a Jtable is shown, a cell of the JTable is a JButton that open a new JFrame (CoveNew):
public void birthstats(String stat) {
//System.out.println(classeMain);
String titolo=new String();
if ("nascite".equals(stat)){
titolo=lingua_corrente.getString("nascite_title");
elencojLabel.setText(titolo);
}
else{
titolo=lingua_corrente.getString("anella");
elencojLabel.setText(titolo);
}
Dimension dimensioni = new Dimension(500, 700);
nascitejDialog.setSize(dimensioni);
nascitejDialog.setTitle("GesAll 1.0 - " + titolo);
nascitejDialog.setModal(true);
hatchlistijTable.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null, null}
},
new String [] {
"Num", lingua_corrente.getString("coppiaLabel"), lingua_corrente.getString("annojLabel"), lingua_corrente.getString("jLabel8"), lingua_corrente.getString("NascitaLabel")
}
) {
Class[] types = new Class [] {
java.lang.String.class, java.lang.String.class, java.lang.String.class, JButton.class, java.lang.String.class
};
boolean[] canEdit = new boolean [] {
false, false, false, false, false
};
@Override
public Class getColumnClass(int columnIndex) {
return types [columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
hatchlistijTable.setShowGrid(true);
hatchlistijTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF);
hatchlistijTable.getColumnModel().getColumn(0).setHeaderValue("Num."); //Numero
hatchlistijTable.getColumnModel().getColumn(0).setResizable(false);
hatchlistijTable.getColumnModel().getColumn(0).setPreferredWidth(60);
hatchlistijTable.getColumnModel().getColumn(1).setHeaderValue(lingua_corrente.getString("coppiaLabel")); //coppia
hatchlistijTable.getColumnModel().getColumn(1).setResizable(false);
hatchlistijTable.getColumnModel().getColumn(1).setPreferredWidth(50);
hatchlistijTable.getColumnModel().getColumn(2).setHeaderValue(lingua_corrente.getString("annojLabel")); //anno
hatchlistijTable.getColumnModel().getColumn(2).setResizable(false);
hatchlistijTable.getColumnModel().getColumn(2).setPreferredWidth(50);
hatchlistijTable.getColumnModel().getColumn(3).setHeaderValue(lingua_corrente.getString("jLabel8")); //gabbia
hatchlistijTable.getColumnModel().getColumn(3).setResizable(false);
hatchlistijTable.getColumnModel().getColumn(3).setPreferredWidth(50);
if ("nascite".equals(stat)){
hatchlistijTable.getColumnModel().getColumn(4).setHeaderValue(lingua_corrente.getString("schiusa")); //data nascita prevista
}
else{
hatchlistijTable.getColumnModel().getColumn(4).setHeaderValue(lingua_corrente.getString("NascitaLabel")); //data nascita
}
hatchlistijTable.getColumnModel().getColumn(4).setResizable(false);
hatchlistijTable.getColumnModel().getColumn(4).setPreferredWidth(150);
hatchlistijTable.setRowHeight(25);
//hatchlistijTable.getColumnModel().getColumn(5).setHeaderValue("Jump"); //salto
//hatchlistijTable.getColumnModel().getColumn(5).setResizable(false);
//hatchlistijTable.getColumnModel().getColumn(5).setPreferredWidth(50);
for (int i=hatchlistijTable.getRowCount()-1;i>=0;i--)
((javax.swing.table.DefaultTableModel) hatchlistijTable.getModel()).removeRow(i);
String qDep = "SELECT d FROM Deposizioni d WHERE d.fecondo=" + '"' + 'S' +'"' +" AND d.morto=" + '"' + 'N' +'"' + " AND d.dataSchiusa is null ORDER by d.dataDeposizione ASC";
if (!"nascite".equals(stat))
qDep = "SELECT d FROM Deposizioni d WHERE d.morto=" + '"' + 'N' +'"' + " AND d.anello is null" + " AND d.dataSchiusa is not null ORDER by d.dataSchiusa ASC";
List depo = DBgateway.getInstance().Run_query(qDep);
System.out.println(depo.size());
//Deposizioni dd = (Deposizioni) DBgateway.getInstance().Run_query(qDep);
for (int i=0;i<depo.size();i++){
//Deposizioni dd = (Deposizioni) DBgateway.getInstance().Run_query(qDep).get(i);
Deposizioni dd = (Deposizioni) depo.get(i);
int toAdd = Program.getConf().getSchiusa();
Calendar cal = Calendar.getInstance();
if ("nascite".equals(stat)){
cal.setTime(dd.getDataDeposizione());
}
else {
toAdd = Program.getConf().getAnellare();
cal.setTime(dd.getDataSchiusa());
}
Calendar today=Calendar.getInstance();
cal.add(Calendar.DATE, toAdd); // add n days
//if(today.after(cal)){
System.out.println(toAdd + " " + today.after(cal) +" " + "nascite".equals(stat));
Object [] rowData=getRowData(dd,i, cal,stat);
if("nascite".equals(stat))
((javax.swing.table.DefaultTableModel) hatchlistijTable.getModel()).addRow(rowData);
else
if(today.after(cal) && !"nascite".equals(stat))
((javax.swing.table.DefaultTableModel) hatchlistijTable.getModel()).addRow(rowData);
}
TableCellRenderer buttonRenderer = new JTableButtonRenderer();
hatchlistijTable.getColumn(lingua_corrente.getString("jLabel8")).setCellRenderer(buttonRenderer);
hatchlistijTable.addMouseListener(new JTableButtonMousePriListener(hatchlistijTable));
nascitejDialog.setVisible(true);
}
private Object[] getRowData(Deposizioni dd,int i, Calendar cal, final String stat) {
try {
String qCp="SELECT c FROM Coppie c WHERE c.idCoppia=" + findDatiCova(dd.getIdDeposizione()).getIdCoppia();
Coppie rCp=(Coppie) DBgateway.getInstance().Run_query(qCp).get(0);
String data = df.format(cal.getTime());
//Bottone salto cova
final JButton jump=new JButton(rCp.getGabbia().toString());
jump.addActionListener(new java.awt.event.ActionListener() {
private Object classeMain = this.getClass();
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
jumpActionPerformed(evt);
}
private void jumpActionPerformed(ActionEvent evt) {
System.out.println("jump" +jump.getText().toString());
String qS ="SELECT c.idCoppia from Coppie c WHERE c.attiva=" + "'"+"S"+"'" + " AND c.gabbia="+jump.getText().toString();
CoveNew cova = new CoveNew(mainClass, (Integer) DBgateway.getInstance().Run_query(qS).get(0),stat);
cova.setVisible(true);
nascitejDialog.setVisible(false);
mainClass.setVisible(false);
}
});
//
Object [] rowData = {i+1, // progressivogianluca
rCp.getNumeroCoppia(), // numero coppia
rCp.getAnno(),
//rCp.getGabbia(), // fecondo
jump,
data};
return(rowData);
} catch (IOException ex) {
Logger.getLogger(Main_menu.class.getName()).log(Level.SEVERE, null, ex);
return null;
}
}
private static class JTableButtonMousePriListener extends MouseAdapter {
private final JTable table;
public JTableButtonMousePriListener(JTable table) {
this.table = table;
}
@Override public void mouseClicked(MouseEvent e) {
int column = table.getColumnModel().getColumnIndexAtX(e.getX());
int row = e.getY()/table.getRowHeight();
if (row < table.getRowCount() && row >= 0 && column < table.getColumnCount() && column >= 0) {
Object value = table.getValueAt(row, column);
if (value instanceof JButton) {
((JButton)value).doClick();
//if(((JButton)value).isEnabled())
// anella(row,column);
}
}
}
}
The JTable is correctly shown the problem I am experiencing is that when I click on the Jbutton the first time, the new JFrame is shown once, if I click once again it is shown 3 times the 7 and so on. Can you help me to show it only once? Thanks Gianluca.
Upvotes: 0
Views: 103
Reputation: 324118
You should not be adding a JButton to the TableModel. JTable uses renderers and editors to display the data.
See Table Button Column for an approach that allows you to store text in the column but then uses a custom renderer/editor for that column so it looks and acts like a button. All you need to do is provide an Action for when you click on the cell.
Upvotes: 2