jtable的行数由while(rs.next()) {......}确定,现在要设某列为单选按钮编辑,在这列中,只能单选一个,请问怎样做?
解决方案 »
- 关于用Xstream解析XML写入数据库
- JAVA编译jar文件问题,大家来关注下
- 多线程的问题
- java多线程读文件的困惑
- 前提只能用java代码实现,因为一切都是动态的。
- 各位是怎么布局控件的?
- 能否把两个数组(String1[],String2[])累加到一个数组里:String3[]
- non-static method doSaveDataImexport() cannot be referenced from a static context 请问是什么意思?我该怎样解决?代码见内,谢谢
- 大家推荐几本java入门书吧!
- 这本书值不值?
- 关于List里的元素是动态的问题。
- 实现Web登陆遇到的问题
JTable table=new JTable();
TableColumn selection=table.getColumn("selection");
selection.setCellRenderer(new BulbRenderer());
selection.setCellEditor(new BulbEditor());
.................
...................
.....................
//BulbRenderer 绘制球状按钮
class BulbRenderer extends DefaultTableCellRenderer{
private ImageIcon darkBulb=new ImageIcon ("button.jpg"),
brightBulb=new ImageIcon ("button.jpg");
public BulbRenderer (){
setHorizontalAlignment(JLable.CENTER);
}
public Component getTableCellRendererComponent(
JTable table,Object value,boolean isSelected,boolean hasFocus,int row ,int col){
Boolean b=(Boolean)value;
setlcon(b.booleanValue()?brightBulb:darkBulb);
return this;
}
}
//显示一个闪亮的球状按钮
class BulbEditor{
BulbRenderer render =new BulbRenderer ();
public BulbEditor(){
render.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
SwingUtilities.invokeLater(new Runnable(){
public void run(){
setCellEditorValue(Boolean.TURE);
fireEditingStopped();
}
});
}
});
}
public Component getTableCellRendererComponent(
JTable table,Object value,boolean isSelected,int row ,int col){
return render.getTableCellRendererComponent(
Jtable,value,true,true, row ,col);
}
}
有没有人用jradiobutton,buttongroup做成功的?
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.tree.*;
import java.awt.event.MouseEvent;
import java.util.EventObject;
abstract public class AbstractCellEditor
implements TableCellEditor {
protected EventListenerList listenerList =
new EventListenerList();
protected Object value;
protected ChangeEvent changeEvent = null;
protected int clickCountToStart = 1;public Object getCellEditorValue() {
return value;
}
public void setCellEditorValue(Object value) {
this.value = value;
}
public void setClickCountToStart(int count) {
clickCountToStart = count;
}
public int getClickCountToStart() {
return clickCountToStart;
}
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
if (((MouseEvent)anEvent).getClickCount() <
clickCountToStart)
return false;
}
return true;
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public void addCellEditorListener(CellEditorListener l) {
listenerList.add(CellEditorListener.class, l);
}
public void removeCellEditorListener(CellEditorListener l) {
listenerList.remove(CellEditorListener.class, l);
}
protected void fireEditingStopped() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i] == CellEditorListener.class) {
if (changeEvent == null)
changeEvent = new ChangeEvent(this);
((CellEditorListener)
listeners[i+1]).editingStopped(changeEvent);
}
}
}
protected void fireEditingCanceled() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length-2; i>=0; i-=2) {
if (listeners[i]==CellEditorListener.class) {
if (changeEvent == null)
changeEvent = new ChangeEvent(this);
((CellEditorListener)
listeners[i+1]).editingCanceled(changeEvent);
}
}
}
}
………………………………………………
我给你的demo是从一个项目中截取的,是有关某列为单选按钮的代码
public Component getTableCellEditorComponent(JTable arg0, Object arg1,
boolean arg2, int arg3, int arg4) {
// TODO 自动生成方法存根
return null;
} 而你给的代码中没有,
abstract public class AbstractCellEditor 需要改类名,改为了SingleCellEditor
用你的代码试了一下,鼠标点击没任何反应。
给这列初始化值,应该怎么写,我给的是new Boolean(false)
class StereoDeckModel extends AbstractTableModel {
String[] columnNames = {
"In Use", "Manufacturer"
};
Object[][] data = {
{ Boolean.FALSE, "Sony"}, { Boolean.FALSE, "Phillips"}, { Boolean.TRUE, "Kenwood"}, { Boolean.FALSE, "Blaupunkt"}, { Boolean.FALSE, "Akai"}, { Boolean.FALSE, "Sony"}, { Boolean.FALSE, "Kenwood"},
};
public Object getValueAt(int row, int col) {
return data[row][col];
}
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columnNames.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Class getColumnClass(int col) {
return data[0][col].getClass();
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
public boolean isCellEditable(int row, int col) {
Class cls = getColumnClass(col);
String name = getColumnName(col);return (cls == Boolean.class && !name.equals("Dolby")) ||
cls == Integer.class || cls == Double.class;
}
public void updateBulbs(int selectedRow) {
for(int r=0; r < getRowCount(); ++r) {
data[r][0] = new Boolean(r == selectedRow);
}
}
}
public class Test extends JFrame {
JTable table = new JTable(new StereoDeckModel());public Test() {
initializeInUseColumn();
//sizeColumns();table.setSelectionMode(
ListSelectionModel.SINGLE_SELECTION);table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
StereoDeckModel model =
(StereoDeckModel)table.getModel(); if(!e.getValueIsAdjusting()) {
model.updateBulbs(table.getSelectedRow());
}
}
});
getContentPane().add(new JScrollPane(table),
BorderLayout.CENTER);
}
private void initializeInUseColumn() {
TableColumn inUseColumn = table.getColumn("In Use");inUseColumn.setCellRenderer(new BulbRenderer());
inUseColumn.setCellEditor(new BulbEditor());
}
public static void main(String args[]) {
GraphicJavaApplication.launch(
new Test(), "Car Stereo Deck", 300,300,559,368);
}
}
class GraphicJavaApplication extends WindowAdapter {
public static void launch(final JFrame f, String title,
final int x, final int y,
final int w, int h) {
f.setTitle(title);
f.setBounds(x,y,w,h);
f.setVisible(true);f.setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);f.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
System.exit(0);
}
});
}
}
class BulbRenderer extends DefaultTableCellRenderer {
private ImageIcon darkBulb = new ImageIcon("C:/expand.gif.gif"),
brightBulb = new ImageIcon("C:/fly.gif");public BulbRenderer() {
setHorizontalAlignment(JLabel.CENTER);
}
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int col) {
Boolean b = (Boolean)value;
setIcon(b.booleanValue() ? brightBulb : darkBulb);
return this;
}
}
有没一个完整的,测试成功的,在行数不确定的jtable中,设某列为单选按钮的代码?