我在jTable中有2列。第一列項目名稱和第二列是複選框添加列。 我試圖將複選框添加到jTable列中,但複選框正在添加到所有列單元格中。但是我想添加複選框僅用於itemname列中具有值的相應單元格。如果itemname值爲null,那麼對應的複選框列也是我想要的設置爲null。當相應的列有空值時,我可以從jtable中刪除複選框嗎?
2
A
回答
2
使用您自己的TableCellEditor和TableCellRenderer,您可以決定想要顯示什麼。下面是一個例子,我「玩」複選框的知名度每三排:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
public class TestTable {
private JFrame f;
private JTable table;
private class MyCheckBoxRendererEditor extends JPanel implements TableCellRenderer, TableCellEditor, ActionListener {
private JCheckBox checkbox;
DefaultTableCellRenderer defaultRenderer;
public MyCheckBoxRendererEditor() {
defaultRenderer = new DefaultTableCellRenderer();
checkbox = new JCheckBox();
checkbox.setOpaque(false);
checkbox.addActionListener(this);
checkbox.setRequestFocusEnabled(false);
setOpaque(true);
add(checkbox);
validate();
}
@Override
public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
@Override
public Object getCellEditorValue() {
return checkbox.isSelected();
}
@Override
public boolean isCellEditable(EventObject anEvent) {
return true;
}
@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
@Override
public boolean stopCellEditing() {
for (CellEditorListener listener : getListeners(CellEditorListener.class)) {
listener.editingStopped(new ChangeEvent(this));
}
return true;
}
@Override
public void cancelCellEditing() {
for (CellEditorListener listener : getListeners(CellEditorListener.class)) {
listener.editingCanceled(new ChangeEvent(this));
}
}
@Override
public void addCellEditorListener(CellEditorListener l) {
this.listenerList.add(CellEditorListener.class, l);
}
@Override
public void removeCellEditorListener(CellEditorListener l) {
this.listenerList.remove(CellEditorListener.class, l);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
configure(table, value, true, true, row, column);
return this;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
configure(table, value, isSelected, hasFocus, row, column);
return this;
}
private void configure(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
defaultRenderer.setBackground(null);
defaultRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
MyObject myObject = ((MyTableModel) table.getModel()).getValueAt(row);
checkbox.setVisible(myObject.getValue() != null);
checkbox.setSelected((Boolean) value);
setBackground(defaultRenderer.getBackground());
setBorder(defaultRenderer.getBorder());
}
}
private class MyObject {
private final String value;
private boolean checked;
public MyObject(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
System.err.println(value + " is " + checked);
}
}
protected void initUI() {
List<MyObject> data = new ArrayList<TestTable.MyObject>();
for (int i = 0; i < 20; i++) {
MyObject object = new MyObject(i % 3 == 1 ? null : "Row " + (i + 1));
data.add(object);
}
table = new JTable(new MyTableModel(data));
table.getColumnModel().getColumn(1).setCellEditor(new MyCheckBoxRendererEditor());
table.getColumnModel().getColumn(1).setCellRenderer(new MyCheckBoxRendererEditor());
table.setRowHeight(30);
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(table), BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
public class MyTableModel extends AbstractTableModel {
private List<MyObject> data;
public MyTableModel(List<MyObject> data) {
super();
this.data = data;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public int getRowCount() {
return data.size();
}
public MyObject getValueAt(int row) {
return data.get(row);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return getValueAt(rowIndex).getValue();
case 1:
return getValueAt(rowIndex).isChecked();
}
return null;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 1) {
getValueAt(rowIndex).setChecked((Boolean) aValue);
}
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 1 && getValueAt(rowIndex).getValue() != null;
}
@Override
public Class<?> getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return Boolean.class;
}
return Object.class;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Value";
case 1:
return "Checked";
}
return null;
}
}
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestTable().initUI();
}
});
}
}
相關問題
- 1. 從列表中刪除空值,並使用複選框jQuery的
- 2. 我可以在Aurelia中刪除複選框輸入嗎?
- 3. 當複選框未選中時刪除hiddenfield中的值jquery
- 4. 僅當選中複選框時,JTable複選框纔會更改
- 5. 可以在運行時從.NET WinForms ListView中刪除複選框嗎?
- 6. 當複選框未選中時從數組中刪除元素
- 7. 當4列有空值時從CSV文件中刪除行
- 8. jtable複選框選中行從表中刪除時點擊按鈕?
- 9. 我可以在迭代時從列表中刪除嗎?
- 10. 當用戶取消選中此複選框時,刪除以前存儲的會話複選框的值
- 11. 如何在選擇複選框時從jtable和數據庫中刪除一行?
- 12. 與jtable中的複選框相關
- 13. 如何從JTable中刪除所有列?
- 14. 刪除複選框中的複選框
- 15. 當我取消刪除時,爲什麼不勾選複選框?
- 16. 當所有值相同時刪除重複值
- 17. 刪除項目從複選框列表
- 18. 當選中JTable中的複選框時發出通知
- 19. 我可以使用edit()刪除值嗎?
- 20. 當選中複選框時,刪除下拉選項
- 21. 複選框,JTable中
- 22. 是否可以刪除空白值精確選擇** ng重複**
- 23. 刪除複選框之間的空格
- 24. 我可以恢復從未提交的已刪除文件嗎?
- 25. 刪除/刪除列表視圖中的所有項目複選框選中
- 26. 我可以從複選框中獲取「id」和「value」元素嗎?
- 27. 我可以從字典中刪除單個值嗎?
- 28. 我可以刪除xxxxxxxAreaRegistration.cs嗎?
- 29. 我可以刪除flashlogs.txt嗎?
- 30. 我可以刪除當前的所有分支嗎?
爲更好地幫助更快張貼[SSCCE(http://sscce.org/) – mKorbel
@mKorbel:我無法訪問上面的鏈接。可以幫助我。提前感謝。 –
javastudent你說你有問題http://sscce.org/?無論如何,@ mKorbel意味着您應該以自包含的格式向我們展示您的代碼,即顯示問題,並且我們可以在家中運行它。 – Boro