Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    10

    JTable con bottoni dentro

    Salve a tutti, dovrei realizzare una tabella dimamica nel numero di righe con 10 colonne e sull'ultima colonna la numero dieci invece di avere un campo testo dovrei mettere un bottone per fare un azione tipo salva riga.

    Potete aiutarmi?

    Grazie

    Willie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280

    Re: JTable con bottoni dentro

    Originariamente inviato da Willie71
    dovrei realizzare una tabella dimamica nel numero di righe con 10 colonne e sull'ultima colonna la numero dieci invece di avere un campo testo dovrei mettere un bottone per fare un azione tipo salva riga.
    Devi gestire un apposito "renderer" e un "editor". C'è un esempio completo tra i miei Java Examples (vedi firma), sezione Tables
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3

    JTable con bottone delete

    Ciao. Spero di non sbagliare essendo il primo messaggio che posto.
    Devo realizzare una tabella con dei bottoni che permettono di cancellare la riga stessa del bottone che viene premuto.
    Ovvero: se premo il bottone della riga n, dev'essere eliminata tutta la riga n.
    Il problema è che premendo il bottone dell'ultima riga si ha sempre l'eccezione

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 >= 3
    at java.util.Vector.elementAt(Vector.java:447)
    at javax.swing.table.DefaultTableModel.setValueAt(Def aultTableModel.java:665)
    at javax.swing.JTable.setValueAt(JTable.java:2686)
    at javax.swing.JTable.editingStopped(JTable.java:4668 )
    at javax.swing.AbstractCellEditor.fireEditingStopped( AbstractCellEditor.java:142)
    at examples.ButtonEditorExample.fireEditingStopped(Ex ample.java:128)
    [..............................]
    [..............................]

    (ovviamente cambia il numero 3 in base al numero di righe totali della tabella)
    NB: Nel codice che ora posto, c'e' anche il problema che vengono cambiati dinamicamente i testi dei bottoni. In realtà poi nell'applicazione che devo realizzare tutti i bottoni avranno lo stesso testo ("X"), quindi il problema del cambio del testo nel mio caso non sussiste...quello dell'eccezione invece eccome purtroppo.
    Ecco il testo:

    import java.awt.Component;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;

    import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.UIManager;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellRenderer;

    public class Example extends JFrame {

    public Example() {
    super("Esempio di JTable con JButton");

    DefaultTableModel dm = new DefaultTableModel();
    dm.setDataVector(new Object[][] { { "Delete0", "blabla0" },{ "Delete1", "blabla1" },{ "Delete2", "blabla2" },{ "Delete3", "blabla3" },
    { "Delete4", "blabla4" } }, new Object[] { "Bottoni", "Altro" });

    JTable table = new JTable(dm);
    table.getColumn("Bottoni").setCellRenderer(new ButtonRendererExample());
    table.getColumn("Bottoni").setCellEditor(
    new ButtonEditorExample(new JCheckBox(), table));
    JScrollPane scroll = new JScrollPane(table);
    getContentPane().add(scroll);
    setSize(400, 200);
    setVisible(true);
    }

    public static void main(String[] args) {


    Example frame = new Example();
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    }
    }

    class ButtonRendererExample extends JButton implements TableCellRenderer {

    public ButtonRendererExample() {
    setOpaque(true);
    }

    public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
    if (isSelected) {
    setForeground(table.getSelectionForeground());
    setBackground(table.getSelectionBackground());
    } else {
    setForeground(table.getForeground());
    setBackground(UIManager.getColor("Button.backgroun d"));
    }
    setText((value == null) ? "" : value.toString());
    return this;
    }
    }

    class ButtonEditorExample extends DefaultCellEditor {
    protected JButton button;
    private String label;
    private boolean isPushed;
    private JTable tabella;
    private int lastrow;

    public ButtonEditorExample(JCheckBox checkBox, JTable tabella) {
    super(checkBox);
    this.tabella = tabella;
    button = new JButton();
    button.setOpaque(true);
    button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
    fireEditingStopped();
    }
    });
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
    boolean isSelected, int row, int column) {
    if (isSelected) {
    button.setForeground(table.getSelectionForeground( ));
    button.setBackground(table.getSelectionBackground( ));
    } else{
    button.setForeground(table.getForeground());
    button.setBackground(table.getBackground());
    }
    label = (value == null) ? "" : value.toString();
    button.setText( label );
    lastrow = row;
    isPushed = true;
    return button;
    }

    @Override
    public Object getCellEditorValue() {
    if (isPushed) {
    //
    //
    JOptionPane.showMessageDialog(button ,"Elimino riga " + lastrow);
    DefaultTableModel dm = (DefaultTableModel) tabella.getModel();
    dm.removeRow(lastrow);
    }
    isPushed = false;
    return new String( label ) ;
    }

    @Override
    public boolean stopCellEditing() {
    isPushed = false;
    return super.stopCellEditing();
    }

    @Override
    protected void fireEditingStopped() {
    super.fireEditingStopped();
    }
    }


    Spero mi possiate dare una mano. Grazie mille.

    ps ho provato anche utilizzando il codice nell'esempio riportato nel messaggio sopra, ma ho sempre lo stesso problema...

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2010
    Messaggi
    1
    mi iscrivo e contribuisco così se qualcuno incappa in questo problema sa come risolvere

    ci ho sbattuto la testa anche io e la soluzione sta nell'override del metodo editingStopped, che viene chiamato su un indice non più valido quando si rimuove l'ultima riga della tabella.
    è un caso particolare perchè capita se si mette un bottone in una cella e il bottone ha la funzione di "rimuovi riga"

    questo è un frammento del mio codice
    Codice PHP:
    mainTable = new JTable(tableModel) {
        public 
    boolean isCellEditable(int row,int col) { ... }
        public 
    void editingStopped(ChangeEvent event) { return; }
    }; 
    ciaoz, Riccardo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.