JTble小問題

lg_asus 2010-07-14 10:29:59
不用TableModel來構建JTable的話,則如何將單元格設置為不可更改?

我知道用TableModel的話重寫isCellEditable()就可以了 如果不用Model的話怎么辦?
...全文
97 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
closewbq 2010-07-14
  • 打赏
  • 举报
回复
给你来个例子吧

import java.awt.Color;
import java.awt.Component;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.EventObject;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

/**
* @version 1.0
*/
public class TestRendererJTableAll extends JFrame{
/** serialVersionUID = 1L. */
private static final long serialVersionUID = 1L;
public TestRendererJTableAll() {
int tableRow = 10;
int tableColumn = 6;
Object[][] datas = new Object[tableRow][tableColumn];
Object[] names = new Object[tableColumn];
for (int r = 0; r < tableRow; r++) {
for (int c = 0; c < tableColumn; c++) {
datas[r][c] = "(" + String.valueOf(r) + "," + String.valueOf(c) + ")";
}
}
for (int c = 0; c < tableColumn; c++) {
names[c] = c;
}
JTable table = new CustomTable(datas, names);
add(new JScrollPane(table));
this.setSize(500, 500);
}

/**
* @author ems
*/
class CustomTable extends JTable {

/** serialVersionUID = 1L */
private static final long serialVersionUID = 1L;

/**
*
*/
public CustomTable() {
super();
}

/**
* @param dm
*/
public CustomTable(TableModel dm) {
super(dm, null, null);
}

/**
* @param rowData
* @param columnNames
*/
public CustomTable(final Object[][] rowData, final Object[] columnNames) {
super(rowData, columnNames);
setRowHeight(super.getRowHeight() + 5);
}

/**
* @see javax.swing.JTable#getCellRenderer(int, int)
*/
@Override
public TableCellRenderer getCellRenderer(int row, int column) {
return new JComponentTableCellRenderer(column);
}

/**
* @see javax.swing.JTable#getCellEditor(int, int)
*/
@Override
public TableCellEditor getCellEditor(int row, int column) {
return new JComponentTableCellRenderer(column);
}

}

/**
* @author ems
*/
class JComponentTableCellRenderer extends JComponent implements
TableCellRenderer,
TableCellEditor {

final Color SELECTION_BACKGROUND = UIManager.getColor("TextField.selectionBackground");

final Color SELECTION_FOREGROUND = UIManager.getColor("TextField.selectionForeground");

private ArrayList<WeakReference> listeners = new ArrayList<WeakReference>();
private static final long serialVersionUID = 1L;
private JComponent component_ = null;
private int type_ = 0;

public JComponentTableCellRenderer(int type) {
this.type_ = type;
}

/**
* @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
* java.lang.Object, boolean, boolean, int, int)
*/
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (null == value) {
return null;
}
setComponent(value);
this.component_.setOpaque(true);
if (isSelected) {
this.component_.setBackground(SELECTION_BACKGROUND);
this.component_.setForeground(SELECTION_FOREGROUND);
}
if (hasFocus) {
this.component_.setBackground(Color.GREEN);
this.component_.setForeground(Color.BLUE);
}
return this.component_;
}

private void setComponent(Object value) {
switch (this.type_) {
case 1: // JButton
case 2: // JButton
this.component_ = new JButton();
((JButton) this.component_).setText(value.toString());
break;
case 3: // JComboBox
this.component_ = new JComboBox();
((JComboBox) this.component_).addItem(value);
((JComboBox) this.component_).addItem("test 1");
((JComboBox) this.component_).addItem("test 2");
break;
case 4: // JCheckBox
this.component_ = new JCheckBox();
if (value.equals(true)) {
((JCheckBox) this.component_).setSelected(true);
} else if (value.equals(false)) {
((JCheckBox) this.component_).setSelected(false);
}
break;
case 5: // JRadioButton
this.component_ = new JRadioButton();
if (value.equals(true)) {
((JRadioButton) this.component_).setSelected(true);
} else if (value.equals(false)) {
((JRadioButton) this.component_).setSelected(false);
}
break;
default: // JLabel, default
this.component_ = new JLabel();
((JLabel) this.component_).setText(value.toString());
}
this.component_.setBorder(null);
}

@Override
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
setComponent(value);
return this.component_;
}

@Override
public void addCellEditorListener(CellEditorListener l) {
listeners.add(new WeakReference(l));
}

@Override
public void cancelCellEditing() {
fireEditingCanceled();
}

@Override
public Object getCellEditorValue() {
Object value = null;
switch (this.type_) {
case 1: // // JButton
value = ((JButton) this.component_).getText();
break;
case 2: // JButton
value = ((JButton) this.component_).getText();
break;
case 3: // JComboBox
value = ((JComboBox) this.component_).getSelectedItem();
break;
case 4: // JCheckBox
value = ((JCheckBox) this.component_).isSelected();
break;
case 5: // JRadioButton
value = ((JRadioButton) this.component_).isSelected();
break;
default: // JLabel, default
value = ((JLabel) this.component_).getText();
}
return value;
}

@Override
public boolean isCellEditable(EventObject anEvent) {
return false;
//这就是重点了。返回true可编辑,返回false不可编辑
}

@Override
public void removeCellEditorListener(CellEditorListener l) {
this.listeners.remove(new WeakReference(l));
}

@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}

@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}

protected void fireEditingStopped() {
ChangeEvent e = new ChangeEvent(this.component_);
for (WeakReference ref : this.listeners) {
CellEditorListener l = (CellEditorListener) ref.get();
l.editingStopped(e);
}
}

protected void fireEditingCanceled() {
ChangeEvent e = new ChangeEvent(this.component_);
for (WeakReference ref : this.listeners) {
CellEditorListener l = (CellEditorListener) ref.get();
l.editingCanceled(e);
}
}

}
public static void main(String[] args){
new TestRendererJTableAll().setVisible(true);
}

}
Jclick 2010-07-14
  • 打赏
  • 举报
回复
isCellEditable()应该是必须的
lg_asus 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 closewbq 的回复:]

Java code

在Jtable中添加的组件实现TableCellEditor接口。
还是将isCellEditable()方法返回false就行了。
[/Quote]

如果只是以二維數組來構建一個JTable的話 怎么解決呢?
closewbq 2010-07-14
  • 打赏
  • 举报
回复

在Jtable中添加的组件实现TableCellEditor接口。
还是将isCellEditable()方法返回false就行了。
lg_asus 2010-07-14
  • 打赏
  • 举报
回复
JTable(data[][],column[]);就可以啊
Jclick 2010-07-14
  • 打赏
  • 举报
回复
不用Model能生成table?
bingmeng_1102 2010-07-14
  • 打赏
  • 举报
回复
路过。。期待。。。
lg_asus 2010-07-14
  • 打赏
  • 举报
回复
多謝。。。
closewbq 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ioshopping 的回复:]
小武 是不是哪方面的都有源码哟 好久向你要点源码
[/Quote]
汗什么,都是以前自己学习过程中积累的资料。
IOshopping 2010-07-14
  • 打赏
  • 举报
回复
小武 是不是哪方面的都有源码哟 好久向你要点源码

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧