gpt4 book ai didi

java - 如何在 JTable 单元格中设置图标?

转载 作者:搜寻专家 更新时间:2023-11-01 02:13:16 25 4
gpt4 key购买 nike

我正在尝试在 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();

}

我有一个像上面那样的表格模型。我想在表格单元格中添加图像图标,并希望在按下该图标时删除单元格。我该如何处理这段代码?请给我完整的描述。

最佳答案

您可以使用 DefaltTableCellRenderer它由 JLabel 支持,然后您可以使用它来设置图标。

最好的解决方案是扩展 DefaltTableCellRenderer 并重写 getTableCellRendererComponent 方法,并根据单元格的需要在单元格上应用所需的图标

您可以通过为给定的 Class 类型定义默认渲染器或直接应用于列来应用渲染器

查看 How to Use JTablesUsing Custom Renderers特别是

更新了例子

这是一种方法,还有很多...

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/TableCellEditorHere's why

关于java - 如何在 JTable 单元格中设置图标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12995433/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com