我們在使用表格的時候一般都是希望用它來進行數據的展示的,但是表格不僅僅可以用來進行顯示數據,還可以在表格中對數據進行操作,或者在表格中添加一些其他的控件來進行一些操作
基本使用:
public static void main(String[] args) {
/*
* 表格的數據是存儲在DefaultTableModel裏面的
*/
Object[] columns={"字段一","字段二","字段三","字段四"};//字段
Object[][] data=null;//需要展示的數據,一般是二維數組
DefaultTableModel model=new DefaultTableModel(data, columns);
JTable table=new JTable(model);
}
進階使用:(對錶格進行渲染,進行編輯,表格中添加控件)
表格中的顯示和編輯是由DefaultTableCellRenderer和TableCellEditor這兩個類分別來控制,根據需要可以重寫這兩個類,下面這個例子實現了基本表格中常用的需求。
1:重寫DefaultTableCellRenderer類
package JTableDemo;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
public class MyTableReander extends DefaultTableCellRenderer{
private static final long serialVersionUID = 1L;
/*對錶格進行渲染的時候單元格默認返回的是JLabel,可以根據需要返回不同的控件*/
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean arg3, int row, int column) {
// TODO Auto-generated method stub
if (column==0) {
JCheckBox box=new JCheckBox();
box.setOpaque(true);
setHorizontalAlignment(box.CENTER);
box.setHorizontalAlignment(JCheckBox.CENTER);
if (isSelected) {//點擊表格的時候改變點擊的行的背景色
box.setBackground(new Color(135, 206, 250));
} else {
if (row % 2 == 0) {
box.setBackground(new Color(240, 250, 250));
box.setForeground(table.getForeground());
} else {
box.setBackground(table.getBackground());
}
}
boolean valu=(Boolean) value;
box.setSelected(valu);
return box;
}
JLabel label = new JLabel();
label.setOpaque(true);
if (isSelected) {//點擊表格的時候改變點擊的行的背景色
label.setBackground(new Color(135, 206, 250));
} else {
if (row % 2 == 0) {
label.setBackground(new Color(240, 250, 250));
label.setForeground(table.getForeground());
} else {
label.setBackground(table.getBackground());
}
}
label.setText(value != null ? value.toString() : "");
return label;
}
}
2:重寫TableCellEditor類(工具類,可以添加JTextField,JCheckBox,JComboBox等控件到單元格中)
package JTableDemo;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.io.Serializable;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.table.TableCellEditor;
public class MyTableCellEditor extends AbstractCellEditor implements TableCellEditor{
protected JComponent editorComponent;
protected EditorDelegate delegate;
protected int clickCountToStart = 1;
public MyTableCellEditor(final JTextField textField) {
editorComponent = textField;
this.clickCountToStart = 2;
delegate = new EditorDelegate() {
public void setValue(Object value) {
textField.setText((value != null) ? value.toString().trim() : "");
}
public Object getCellEditorValue() {
return textField.getText();
}
};
textField.addActionListener(delegate);
}
public MyTableCellEditor(final JCheckBox checkBox) {
editorComponent = checkBox;
checkBox.setSelected(false);
checkBox.setHorizontalAlignment(JCheckBox.CENTER);
delegate = new EditorDelegate() {
public void setValue(Object value) {
boolean selected = false;
if (value instanceof Boolean) {
selected = ((Boolean)value).booleanValue();
}
else if (value instanceof String) {
selected = value.equals("true");
}
checkBox.setSelected(selected);
}
public Object getCellEditorValue() {
return Boolean.valueOf(checkBox.isSelected());
}
};
checkBox.addActionListener(delegate);
checkBox.setRequestFocusEnabled(false);
}
public MyTableCellEditor(final JComboBox comboBox) {
editorComponent = comboBox;
comboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE);
delegate = new EditorDelegate() {
public void setValue(Object value) {
comboBox.setSelectedItem(value);
}
public Object getCellEditorValue() {
return comboBox.getSelectedItem();
}
public boolean shouldSelectCell(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
MouseEvent e = (MouseEvent)anEvent;
return e.getID() != MouseEvent.MOUSE_DRAGGED;
}
return true;
}
public boolean stopCellEditing() {
if (comboBox.isEditable()) {
// Commit edited value.
comboBox.actionPerformed(new ActionEvent(
MyTableCellEditor.this, 0, ""));
}
return super.stopCellEditing();
}
};
comboBox.addActionListener(delegate);
}
public Component getComponent() {
return editorComponent;
}
public void setClickCountToStart(int count) {
clickCountToStart = count;
}
public int getClickCountToStart() {
return clickCountToStart;
}
public Object getCellEditorValue() {
return delegate.getCellEditorValue();
}
public boolean isCellEditable(EventObject anEvent) {
if(anEvent != null && delegate != null){
return delegate.isCellEditable(anEvent);
}else{
return false;
}
}
public boolean shouldSelectCell(EventObject anEvent) {
return delegate.shouldSelectCell(anEvent);
}
public boolean stopCellEditing() {
return delegate.stopCellEditing();
}
public void cancelCellEditing() {
delegate.cancelCellEditing();
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected,
boolean expanded,
boolean leaf, int row) {
String stringValue = tree.convertValueToText(value, isSelected,
expanded, leaf, row, false);
delegate.setValue(stringValue);
return editorComponent;
}
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected,
int row, int column) {
delegate.setValue(value);
return editorComponent;
}
protected class EditorDelegate implements ActionListener, ItemListener, Serializable {
/** The value of this cell. */
protected Object value;
public Object getCellEditorValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
}
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean startCellEditing(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public void actionPerformed(ActionEvent e) {
MyTableCellEditor.this.stopCellEditing();
}
public void itemStateChanged(ItemEvent e) {
MyTableCellEditor.this.stopCellEditing();
}
}
}
3:重寫DefaultTableModel類
package JTableDemo;
import javax.swing.table.DefaultTableModel;
public class MyTableModel extends DefaultTableModel{
private static final long serialVersionUID = 1L;
private static final String[] columns={"字段一","字段二","字段三","字段四"};//所有的列字段
public MyTableModel(Object[][] data){
super(data, columns);
}
@Override
public boolean isCellEditable(int row, int column) {
// TODO Auto-generated method stub
//重寫isCellEditable方法,設置是否可以對錶格進行編輯,也可以設置某行或者列,可以編輯或者不可以編輯
return super.isCellEditable(row, column);
}
@Override
public void setValueAt(Object arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
super.setValueAt(arg0, arg1, arg2);
}
}
最後效果:
源碼下載鏈接:https://download.csdn.net/download/qq_36880602/10472256