需要做一个jtable 在里面填充数据,
用户可以根据自己的需求选中其中一列或者一行,在提交的时候不提交这列或者行
我的想法是在每列上面加checkbox
在每列的前面加checkbox 在用户提交的时候判断这些checkbox的值原来是搞WEB的,搞GUI,不会啊,各位大哥大姐help me 我从SUN上下了一个例子是可以在每行前面加checkbox是implements AbstractTableModel的
用户可以根据自己的需求选中其中一列或者一行,在提交的时候不提交这列或者行
我的想法是在每列上面加checkbox
在每列的前面加checkbox 在用户提交的时候判断这些checkbox的值原来是搞WEB的,搞GUI,不会啊,各位大哥大姐help me 我从SUN上下了一个例子是可以在每行前面加checkbox是implements AbstractTableModel的
model = new DefaultTableModel(new Object[] {
"column1",
"column2",
"column3" }, 10) { @Override
public Class<?> getColumnClass(int columnIndex) {
if(columnIndex==0) {
return Boolean.class;
}
return super.getColumnClass(columnIndex);
}
};
table = new JTable(model);
有没加一行checkbox在每个标题上方加一个checkbox,提交的时候根据这个checkbox来判断用户是否需要这列
implements TableCellRenderer{}然后在table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new CheckBoxHeader());
就可以把列头变为CheckBox.
implements TableCellRenderer{ }
写了一个这个结果变成抽象类了,报错,
有点理解你的意思,不过还是写不出来,对 swing 不熟,能不能给个小例子
{
Object colNames[] = {"Col1", "Col2", "Col3", "Col4"};
Object[][] data = null;
DefaultTableModel dtm;
public CheckBoxHeaderTest()
{
setLocation(400,100);
setDefaultCloseOperation(EXIT_ON_CLOSE);
dtm = new DefaultTableModel(data,colNames); for(int x = 0; x < 5; x++)
{
dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2",
"Row "+(x+1)+" Col 3","Row "+(x+1)+" Col 4"});
} JTable table = new JTable();
JScrollPane sp = new JScrollPane();
sp.setViewportView(table);
MyItemListener myItemListener = new MyItemListener(); table.setModel(dtm); TableColumn tc = table.getColumnModel().getColumn(0); tc.setCellEditor(table.getDefaultEditor(Boolean.class));
tc.setCellRenderer(table.getDefaultRenderer(Boolean.class)); for(int i=1;i<table.getColumnCount();i++)
table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new MyTableHeaderRenderer(myItemListener)); getContentPane().add(sp);
pack();
}
public static void main (String[] args){
new CheckBoxHeaderTest().setVisible(true);
}
class MyItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked" : "unchecked";
int column = ((MyTableHeaderRenderer)(e.getItem())).getColumn();
System.out.println("column:"+column + state);
}
} public class MyTableHeaderRenderer extends JCheckBox implements TableCellRenderer,MouseListener{ protected int column; protected boolean mousePressed = false; public MyTableHeaderRenderer(ItemListener itemListener) { this.addItemListener(itemListener);
} public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) { if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
this.setForeground(header.getForeground());
this.setFont(header.getFont());
header.addMouseListener(this);
}
} setColumn(column);
this.setHorizontalAlignment(SwingConstants.CENTER); this.setText(null);
return this;
}
protected void setColumn(int column) {
this.column = column;
}
public int getColumn() {
return column;
}
private void handleClickEvent(MouseEvent e) {
if (mousePressed) {
mousePressed=false; JTableHeader header = (JTableHeader)(e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
doClick();
}
}
} public void mouseClicked(MouseEvent e) {
handleClickEvent(e);
((JTableHeader)e.getSource()).repaint();
} public void mousePressed(MouseEvent e) {
mousePressed = true;
} public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
} }}
for(int x = 0; x < 5; x++)
{
dtm.addRow(new Object[]{new Boolean(true),"Row "+(x+1)+" Col 2",
"Row "+(x+1)+" Col 3","Row "+(x+1)+" Col 4"});
}
protected String columnName; protected boolean mousePressed = false; public MyTableHeaderRenderer(ItemListener itemListener) {
this.addItemListener(itemListener);
} public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
this.setForeground(header.getForeground());
this.setFont(header.getFont());
header.addMouseListener(this);
}
}
setColumn(column);
setColumnName(column,table); this.setHorizontalAlignment(SwingConstants.CENTER);
this.setText((String) table.getTableHeader().getColumnModel().getColumn(column).getHeaderValue()); return this;
}
protected void setColumn(int column) {
this.column = column;
}
protected void setColumnName(int column,JTable table) {
this.columnName = table.getTableHeader().getColumnModel().getColumn(column).getHeaderValue().toString();
}
public String getColumnName(){
return columnName;
}
public int getColumn() {
return column;
}
private void handleClickEvent(MouseEvent e) {
if (mousePressed) {
mousePressed=false; JTableHeader header = (JTableHeader)(e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
doClick();
}
}
} public void mouseClicked(MouseEvent e) {
handleClickEvent(e);
((JTableHeader)e.getSource()).repaint();
} public void mousePressed(MouseEvent e) {
mousePressed = true;
} public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) {
} public void mouseExited(MouseEvent e) {
} }我改了一些重写类里的方法,我想让重写后第一行的boolean都是true,也就是都是默认选中
public MyTableHeaderRenderer(ItemListener itemListener) {
doClick();
this.addItemListener(itemListener);
}
public void itemStateChanged(ItemEvent e) {
String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked" : "unchecked";
int column = ((MyTableHeaderRenderer)(e.getItem())).getColumn();
System.out.println("column:"+column + state);
if(state.equals("checked")){
vector.add(((MyTableHeaderRenderer)(e.getItem())).getColumnName());
}else{
vector.remove(((MyTableHeaderRenderer)(e.getItem())).getColumnName());
}
}
} 我现在的做法是,我面板在提交后会重新回到这个面板只是数据不同了,如果点击一次check的时候把他的值加载到vector中,再判断,重复提交几次的话,就会在vector中增加几条记录比如第一次提交的时候vector 是col1
二次提交的话,col1这个事件就会响应两次,vector 变成了[col1,col1]
接着提交就是3次,好象总是面板在叠加
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) { if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
this.setForeground(header.getForeground());
this.setFont(header.getFont());
header.addMouseListener(this);
}
}
try {
ArrayList newList = new ArrayList();
vecData = util.changeHold(list, vecName, type);//list是代表现在填充的值,vecname是用户选中的列的集合,返回的是一个根据用户选中的值的列重新组装的一个VEC然后再把他封装到tablemodel中
}
catch (Exception ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
}
jmodel = null;
changeVector = new Vector();
dtm.setDataVector(vecData, vecName);
sTable.setModel(dtm);
MyItemListener myItemListener = new MyItemListener();
for (int i = 0; i < sTable.getColumnCount(); i++) {
sTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new
MyTableHeaderRenderer(myItemListener));
}
this.repaint();
}
MyItemListener myItemListener = new MyItemListener();
for (int i = 0; i < sTable.getColumnCount(); i++) {
sTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new
MyTableHeaderRenderer(myItemListener));
}
this.repaint();
试试..
public MyTableHeaderRenderer(ItemListener itemListener) {
doClick();
//this.addItemListener(itemListener);
}
再次加载时用这个.
这样更不容易出问题但是我怎么都获取不到tablehead中的text属性