4

Jtableのセルに画像アイコンを追加しようとしています。私は以下のようなコードを持っています。そのために私は何をすべきですか?

package com.orb;
private final LinkedList<Product> list= new LinkedList<Product>();
private final LinkedList<Boolean> checkList = new LinkedList<Boolean>();
public void addItem(Product customer) {
    list.add(customer);
    checkList.add(false);
    checkList.remove(true);
    fireTableDataChanged();
  }

@Override
public int getColumnCount() {
        return 6;
}

@Override
public int getRowCount() {
    return list.size();
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    Object obj = null;

    if(columnIndex==4){
        setTotal(list.get(rowIndex));
    }

    switch (columnIndex){
        case 0: obj= list.get(rowIndex).getCode() ;break;
        case 1: obj=list.get(rowIndex).getDescription(); break;
        case 2: obj=list.get(rowIndex).getQuantity();break;
        case 3: obj=list.get(rowIndex).getPrice();break;            
        case 4: obj=list.get(rowIndex).getTotal();break;
    }
    return obj;
}

@Override
public Class<?> getColumnClass(int arg0) {

    switch(arg0){
    case 0: case 1: return String.class; 
    case 2: return Integer.class; 
    case 3: case 4: return Double.class;

    //case 5: return ImageIcon.class;
    }
    return super.getColumnClass(arg0);
}

@Override
public boolean isCellEditable(int arg0, int arg1) {
    boolean isCellEditable = false;
    switch(arg1){
    case 2: case 3: isCellEditable= true;break;
    default: isCellEditable= false;break;
    }
    return isCellEditable;
    //return super.isCellEditable(arg0, arg1);
}

@Override
public void setValueAt(Object arg0, int arg1, int arg2) {
    System.out.println("Value seted" +arg0 + arg1 + arg2);

    switch(arg2){
    case 0: break;
    case 1: break;
    case 2: list.get(arg1).setQuantity((Integer)arg0); setTotal(list.get(arg1)); break;
    case 3: list.get(arg1).setPrice((Double)arg0); setTotal(list.get(arg1));break;          
    case 4: list.get(arg1).setTotal((Double)arg0);break;

       //case 0: checkList.set(arg1, (Boolean)arg0);break;
       default:break;
    }

    fireTableDataChanged();
}

public LinkedList<Product> getList() {
    LinkedList<Product> temp = new LinkedList<Product>();
    int index=-1;
    for(Boolean isSelected:checkList){
        index++;
        if(isSelected){
            temp.add(list.get(index));
        }
    }
    return temp;
}

public void deleteRow(int rowNubmer)
{
    list.remove(rowNubmer);     
    fireTableDataChanged();
}

public void setTotal(Product product){
    Double total = 0.0d;
    total = product.getQuantity ()* product.getPrice();
    product.setTotal(total);

}
@Override
public void fireTableDataChanged() {
    super.fireTableDataChanged();       

}

上記のようなテーブルモデルがあります。テーブルセルに画像アイコンを追加し、そのアイコンが押されたときにセルを削除したい。このコードをどのように使用できますか?これについて詳しく説明してください。

4

2 に答える 2

4

アイコンを設定するために使用できるaに裏打ちDefaltTableCellRendererされたaを使用できます。JLabel

最善の解決策は、メソッドを拡張DefaltTableCellRendererしてオーバーライドし、getTableCellRendererComponent必要に応じてセルごとにアイコンを適用することです。

特定のタイプのデフォルトレンダラーを定義するかClass、列に直接レンダラーを適用できます。

特にJTablesの使用方法とカスタムレンダラーの使用方法を確認してください

例で更新

これはアプローチですもっとたくさんあります...

public class TestTable {

    public static void main(String[] args) {
        new TestTable();
    }

    public TestTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JTable table = new JTable();
                table.setGridColor(Color.LIGHT_GRAY);
                table.setShowGrid(true);
                table.setShowHorizontalLines(true);
                table.setShowVerticalLines(true);                
                table.setModel(new TestTableModel());
                table.getColumn("X").setCellRenderer(new DeleteCellRenderer());
                table.getColumn("X").setCellEditor(new DeleteCellEditor());

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class TestTableModel extends AbstractTableModel {

        private List<RowData> rowData;

        public TestTableModel() {
            rowData = new ArrayList<RowData>(25);
            for (int index = 0; index < 10; index++) {
                rowData.add(new RowData(index));
            }
        }

        @Override
        public String getColumnName(int column) {
            return column == 0 ? "Text" : "X";
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            RowData rd = rowData.get(rowIndex);
            return rd.isDeletable();
        }

        @Override
        public int getRowCount() {
            return rowData.size();
        }

        @Override
        public int getColumnCount() {
            return 2;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            RowData rd = rowData.get(rowIndex);
            return columnIndex == 0 ? rd.getText() : rd.isDeletable();
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
            RowData rd = rowData.get(rowIndex);
            if (columnIndex == 1) {
                if (aValue instanceof Boolean && (Boolean)aValue) {
                    rowData.remove(rd);
                    fireTableRowsDeleted(rowIndex, rowIndex);
                }
            }
        }

    }

    public class RowData {

        private String text;
        private boolean deletable;

        public RowData(int row) {
            text = "Row " + row;
            deletable = Math.round(Math.random() * 1) == 0;
        }

        public String getText() {
            return text;
        }

        public boolean isDeletable() {
            return deletable;
        }        
    }

    public class DeleteCellRenderer extends DefaultTableCellRenderer {

        public DeleteCellRenderer() {
            try {
                BufferedImage img = ImageIO.read(getClass().getResource("/Delete.png"));
                setIcon(new ImageIcon(img));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            setText(null);
            if (value instanceof Boolean && (Boolean)value) {
                setEnabled(true);
            } else {
                setEnabled(false);
            }
            return this;
        }        
    }

    public class DeleteCellEditor extends AbstractCellEditor implements TableCellEditor {

        private JLabel label;

        public DeleteCellEditor() {
            label = new JLabel("Delete");
        }

        @Override
        public Object getCellEditorValue() {
            return true;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    stopCellEditing();
                }
            });
            return label;
        }

        @Override
        public boolean isCellEditable(EventObject e) {
            return true;
        }        
    }    
}

更新しました

JButton/を使ってみませんTableCellEditorか? これが理由です

于 2012-10-21T06:28:39.227 に答える
2

これは、 JLabelを拡張できるカスタム セル レンダラーを介して行われます。JLabelのアイコンを簡単に設定できます。ここに適切な例があります。

Renderer は、JTableがセルの状態とコンテンツを渡してgetTableCellRendererComponentを呼び出した後、それ自体をテーブル セルとして描画する必要があるコンポーネントです。レンダラーが独自にプロパティを設定し、thisを返すのは一般的です。レンダラーは、 Componentを拡張する限り、他のオブジェクトを返すこともできます。

于 2012-10-21T06:10:19.173 に答える