Java 如何向采用值id的每行添加删除操作
因此,我在向每一行添加一个操作以删除从“值”列中获取id的选定行时遇到问题,因为“删除”列在所有单元格中都有- 我有ButtonRenderer和ButtonEditor将按钮添加到JTable 纽扣拆卸器Java 如何向采用值id的每行添加删除操作,java,swing,jtable,row,jbutton,Java,Swing,Jtable,Row,Jbutton,因此,我在向每一行添加一个操作以删除从“值”列中获取id的选定行时遇到问题,因为“删除”列在所有单元格中都有- 我有ButtonRenderer和ButtonEditor将按钮添加到JTable 纽扣拆卸器 import java.awt.Component; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.table.TableCel
import java.awt.Component;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
/**
*
* @author joepa37
*/
public class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
@Override
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.background"));
}
setText((value == null) ? "" : value.toString());
return this;
}
}
按钮编辑器
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
/**
*
* @author joepa37
*/
public class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(new ActionListener() {
@Override
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);
isPushed = true;
return button;
}
@Override
public Object getCellEditorValue() {
if (isPushed) {
//
//
JOptionPane.showMessageDialog(button, label + ": Ouch!");
// System.out.println(label + ": Ouch!");
}
isPushed = false;
return new String(label);
}
@Override
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
@Override
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}
我的桌子在这里
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableColumn;
/**
*
* @author joepa37
*/
public class deleteRowTable extends JFrame{
public deleteRowTable(){
super();
this.add(getPreview());
setSize(500,500);
setVisible(true);
}
public static void main(String args[]){
new deleteRowTable();
}
public Component getPreview ()
{
// Table
JTable table = new JTable ( new ExampleTableModel () );
JScrollPane scrollPane = new JScrollPane ( table );
// Custom column
TableColumn buttonColumn = table.getColumnModel ().getColumn ( 0 );
// Custom renderer
buttonColumn.setCellRenderer(new ButtonRenderer());
// Custom editor
buttonColumn.setCellEditor(new ButtonEditor(new JCheckBox()));
return scrollPane;
}
public class ExampleTableModel extends AbstractTableModel
{
private String[] columnNames = { "Delete", "Values"};
private Object[][] data = { { "-", "id1"},
{ "-", "id2"},
{ "-", "id3"},
{ "-", "id4"},
{ "-", "id"}
};
public final Object[] longValues = { "-", "Value"};
@Override
public int getColumnCount ()
{
return columnNames.length;
}
@Override
public int getRowCount ()
{
return data.length;
}
@Override
public String getColumnName ( int col )
{
return columnNames[ col ];
}
@Override
public Object getValueAt ( int row, int col )
{
return data[ row ][ col ];
}
@Override
public Class getColumnClass ( int c )
{
return longValues[ c ].getClass ();
}
@Override
public boolean isCellEditable ( int row, int col )
{
return true;
}
@Override
public void setValueAt ( Object value, int row, int col )
{
data[ row ][ col ] = value;
fireTableCellUpdated ( row, col );
}
}
}
您可以从编辑器中获取行号。一种方式是通过:
class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
private int myRow; // *******added **********
public ButtonEditor(JCheckBox checkBox) {
// ..............
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
this.myRow = row; // *******added **********
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);
isPushed = true;
return button;
}
@Override
public Object getCellEditorValue() {
if (isPushed) {
// can get the row number here
JOptionPane.showMessageDialog(button, label + ": Ouch! " + myRow);
}
isPushed = false;
return new String(label);
}
有了行号后,就可以访问模型持有的该行上的任何项目。如果行已排序,则可能需要从视图转换为模型
例如:
import java.awt.Component;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
@SuppressWarnings("serial")
public class deleteRowTable extends JFrame {
public deleteRowTable() {
super();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
this.add(getPreview());
setSize(500, 500);
setVisible(true);
}
public static void main(String args[]) {
new deleteRowTable();
}
public Component getPreview() {
// Table
JTable table = new JTable(new ExampleTableModel());
JScrollPane scrollPane = new JScrollPane(table);
// Custom column
TableColumn buttonColumn = table.getColumnModel().getColumn(0);
// Custom renderer
buttonColumn.setCellRenderer(new ButtonRenderer());
// Custom editor
buttonColumn.setCellEditor(new ButtonEditor(new JCheckBox()));
return scrollPane;
}
public class ExampleTableModel extends AbstractTableModel {
private String[] columnNames = { "Delete", "Values" };
private Object[][] data = { { "-", "id1" }, { "-", "id2" },
{ "-", "id3" }, { "-", "id4" }, { "-", "id" } };
public final Object[] longValues = { "-", "Value" };
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int row, int col) {
return data[row][col];
}
@Override
public Class<?> getColumnClass(int c) {
return longValues[c].getClass();
}
@Override
public boolean isCellEditable(int row, int col) {
return true;
}
@Override
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
}
@SuppressWarnings("serial")
class ButtonEditor extends DefaultCellEditor {
protected JButton button;
private String label;
private boolean isPushed;
private int myRow;
private JTable table;
public ButtonEditor(JCheckBox checkBox) {
super(checkBox);
button = new JButton();
button.setOpaque(true);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
fireEditingStopped();
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
this.myRow = row;
this.table = table;
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);
isPushed = true;
return button;
}
@Override
public Object getCellEditorValue() {
if (isPushed) {
deleteRowTable.ExampleTableModel model = (deleteRowTable.ExampleTableModel) table.getModel();
String label = (String) model.getValueAt(myRow, 1);
if (label != null) {
JOptionPane.showMessageDialog(button, "This is your label: " + label);
// delete the model's row here if desired.
}
}
isPushed = false;
return new String(label);
}
@Override
public boolean stopCellEditing() {
isPushed = false;
return super.stopCellEditing();
}
@Override
protected void fireEditingStopped() {
super.fireEditingStopped();
}
}
@SuppressWarnings("serial")
class ButtonRenderer extends JButton implements TableCellRenderer {
public ButtonRenderer() {
setOpaque(true);
}
@Override
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.background"));
}
setText((value == null) ? "" : value.toString());
return this;
}
}
导入java.awt.Component;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
@抑制警告(“串行”)
公共类deleteRowTable扩展了JFrame{
公共deleteRowTable(){
超级();
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
添加(getPreview());
设置大小(500500);
setVisible(真);
}
公共静态void main(字符串参数[]){
新的deleteRowTable();
}
公共组件getPreview(){
//桌子
JTable table=新的JTable(新的ExampleTableModel());
JScrollPane scrollPane=新的JScrollPane(表);
//自定义列
TableColumn按钮Column=table.getColumnModel().getColumn(0);
//自定义渲染器
setCellRenderer(新的ButtonRenderer());
//自定义编辑器
setCellEditor(新的ButtonEditor(新的JCheckBox());
返回滚动窗格;
}
公共类ExampleTableModel扩展了AbstractTableModel{
私有字符串[]columnNames={“Delete”,“Values”};
私有对象[][]数据={{-”,“id1”},{-”,“id2”},
{“-”、“id3”}、{“-”、“id4”}、{“-”、“id”};
公共最终对象[]longValues={“-”,Value};
@凌驾
public int getColumnCount(){
返回columnNames.length;
}
@凌驾
public int getRowCount(){
返回数据长度;
}
@凌驾
公共字符串getColumnName(int-col){
返回列名[col];
}
@凌驾
公共对象getValueAt(整数行,整数列){
返回数据[行][col];
}
@凌驾
公共类getColumnClass(int c){
返回longValues[c].getClass();
}
@凌驾
公共布尔值可编辑(int行,int列){
返回true;
}
@凌驾
public void setValueAt(对象值、整行、整列){
数据[行][列]=值;
FireTableCell更新(行、列);
}
}
}
@抑制警告(“串行”)
类ButtonEditor扩展DefaultCellEditor{
受保护的按钮;
私有字符串标签;
私有布尔值被推;
密罗私人酒店;
专用JTable表;
公共按钮编辑器(JCheckBox复选框){
超级(复选框);
按钮=新的JButton();
按钮。设置不透明(true);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
fireEditingStopped();
}
});
}
@凌驾
公共组件getTableCellEditorComponent(JTable表、对象值、,
布尔值(选定,int行,int列){
this.myRow=行;
this.table=表格;
如果(当选){
setForeground(table.getSelectionForeground());
setBackground(table.getSelectionBackground());
}否则{
set前台(table.get前台());
setBackground(table.getBackground());
}
label=(value==null)?“”:value.toString();
按钮.setText(标签);
isPushed=true;
返回按钮;
}
@凌驾
公共对象getCellEditorValue(){
如果(已推送){
deleteRowTable.ExampleTableModel=(deleteRowTable.ExampleTableModel)table.getModel();
字符串标签=(字符串)model.getValueAt(myRow,1);
如果(标签!=null){
showMessageDialog(按钮,“这是您的标签:”+标签);
//如果需要,请在此处删除模型的行。
}
}
isPushed=false;
返回新字符串(标签);
}
@凌驾
公共布尔stopCellEditing(){
isPushed=false;
返回super.stopCellEditing();
}
@凌驾
受保护的无效fireEditingStopped(){
super.fireEditingStopped();
}
}
@抑制警告(“串行”)
类ButtonRenderer扩展JButton实现TableCellRenderer{
公共按钮注释器(){
set不透明(true);
}
@凌驾
公共组件GetTableCellRenderComponent(JTable表、对象值、,
布尔值(已选择,布尔值为焦点,整数行,整数列){
如果(当选){
setForeground(table.getSelectionForeground());
挫折背景(table.getSelectionBackground());
}否则{
set前台(table.get前台());
挫折背景(UIManager.getColor(“Button.background”);
}
setText((value==null)?“”:value.toString());
归还这个;
}
}