Gianluca Pasqualato
Gianluca Pasqualato

Reputation: 153

Jbutton performing more action

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

Answers (1)

camickr
camickr

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

Related Questions