Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
230 views
in Technique[技术] by (71.8m points)

java - Custom button renderer to run code per table entry

I want to have a table where there is a button per entry that would add the Book object to a List called Cart (within a separate class, this has been handled).

What is the best (not easiest) way that I can interface something like that to my current TableModel class as below:

import com.libman.book.Book;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;

public class SearchTableModel extends AbstractTableModel
{
    private final String[] columnNames = { "Title", "Author", "Genre", "ISBN", "Checkout"};
    private List<Book> books = new ArrayList();
    private String cartText = "Add to cart";
    
    public SearchTableModel(List<Book> books)
    {
         this.books = books;
    }
    
    @Override
    public String getColumnName(int columnIndex)
    {
         return columnNames[columnIndex];
    }
    
    @Override
    public int getRowCount() 
    {
        return books.size();
    }

    @Override
    public int getColumnCount() 
    {
        return columnNames.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) 
    {
        Book book = books.get(rowIndex);
        switch (columnIndex) 
        {
            case 0: 
                return book.getTitle();
            case 1:
                return book.getAuthor();
            case 2:
                return book.getGenre();
            case 3:
                return book.getISBN();
            case 4:
                return cartText;
        }
        return null;
    }
    
    @Override
    public Class<?> getColumnClass(int columnIndex)
    {
        switch (columnIndex)
        {
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return String.class;
            case 3:
                return String.class;
            case 4: 
                return String.class;
        }
        return null;
    } 
    
    public void setCartText(String t)
    {
        cartText = t;
    }
}


class JTableButtonRenderer implements TableCellRenderer 
{
    private TableCellRenderer defaultRenderer;
    public JTableButtonRenderer(TableCellRenderer renderer) {
       defaultRenderer = renderer;
    }
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        if(value instanceof Component)
        return (Component)value;
            return defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    }
}

. An example of how I'd like the button to look(taken by using the Button Column Class from this online example https://tips4java.wordpress.com/2009/07/12/table-button-column/)

Ideally, the button press should be able to trigger a set of methods, so I'm assuming it'd involve an ActionListener but I'm not that familiar with setting things like this up (first big project).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)
等待大神答复

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...