import javaawtBorderLayout;
import javaawtComponent;
import javaxswingDefaultCellEditor;
import javaxswingJCheckBox;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJTable;
import javaxswingtableDefaultTableModel;
import javaxswingtableTableCellRenderer;
import javaxswingtableTableColumnModel;
@SuppressWarnings("serial")
public class TestJtable extends JPanel {
public TestJtable(){
init();
}
private void init() {
setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(createTable());
add(scrollPane);
}
private JTable createTable() {
JTable table = new JTable();
String[] tableHeads = new String[]{"姓名","年龄","是否通过"};
DefaultTableModel dtm = (DefaultTableModel)tablegetModel();
dtmsetColumnIdentifiers(tableHeads);
/添加的一些数据,也可以从数据库中提取数据/
dtmaddRow(new Object[]{"aa","12",new Boolean(true)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
dtmaddRow(new Object[]{"aa","12",new Boolean(false)});
dtmaddRow(new Object[]{"bb","34",new Boolean(false)});
/设置table的列模型/
TableColumnModel tcm = tablegetColumnModel();
tcmgetColumn(2)setCellEditor(new DefaultCellEditor(new JCheckBox()));
tcmgetColumn(2)setCellRenderer(new TestTableCellRenderer());
tcmgetColumn(2)setPreferredWidth(80);
tcmgetColumn(2)setWidth(80);
tcmgetColumn(2)setMaxWidth(80);
return table;
}
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframesetBounds(300,100,300,200);
jframesetTitle("测试");
jframeadd(new TestJtable());
jframesetVisible(true);
}
class TestTableCellRenderer extends JCheckBox implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Boolean b = (Boolean) value;
thissetSelected(bbooleanValue());
return this;
}
}
}
一直没有时间给你说,不好意思。今天下午有点空。有什么不明白的。可以问我。问题拆分来看,其实就是一个渲染和表格单元格选中事件,以下代码仅做参考:
final JComboBox comboBox = new JComboBox();
groups = new ArrayList<String>();
comboBoxsetEditable(true);
TableComboBoxEditor editor = new TableComboBoxEditor(comboBox);
tablegetColumnModel()getColumn(2)setCellEditor(editor);
tablegetModel()addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
if (egetType() == TableModelEventUPDATE && egetColumn() == 2) {
int lastRow = egetLastRow();
Object value = tablegetValueAt(lastRow, 2);
if (value != null && !valueequals("") && !groupscontains(valuetoString())) {
String item = valuetoString();
groupsadd(item);
comboBoxaddItem(item);
comboBoxsetSelectedItem(item);
}
}
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
requestFocus();
}
});
java swing中在jTable中添加多个复选框的方式如下:
import javaawtComponent;import javaawteventActionEvent;
import javaawteventActionListener;
import javaxswing;
import javaxswingtable;
public class MyFirstJFrame extends JFrame {
// 作为测试的main方法
public static void main(String[] args) {
new MyFirstJFrame()setVisible(true);
}
/
构造方法
/
public MyFirstJFrame() {
InitialComponent();
}
/
初始化组件的方法
/
private void InitialComponent(){
// 设置窗体参数
// 设置布局模式
setLayout(null);
// 设置窗体大小
setSize(480, 360);
// 设置窗体居中(非常规方法)
setLocationRelativeTo(null);
// 关闭窗体退出程序
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// 初始化面板
panel = new JPanel();
panelsetSize(thisgetWidth(), thisgetHeight());
panelsetLocation(0,0);
panelsetLayout(null);
// 初始化表格
table = new JTable(new DefaultTableModel(new Object[][]{{"第一行"},{"第二行"},{"第三行"},{"第四行"}}, new String[]{"测试行1","测试行2"}){
/ (non-Javadoc)
重写方法,判断表单元格是否可编辑
可以通过row和column索引判断某一个单元格是否可编辑
此处设为都不可编辑
@see javaxswingtableDefaultTableModel#isCellEditable(int, int)
/
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
});
// 开始向表格中添加复选框(注意:此示例较为简单,缺省很多判断,也没有动态代码支持)
// 通过设置列渲染
// 方法一:直接方式 使用TableColumn的setCellRenderer方法(推荐)
// 此方法可以设置某一列的渲染(即使用某一个组件--即控件来显示单元格数据)
tablegetColumnModel()getColumn(1)setCellRenderer(new TableCellRenderer(){
/(non-Javadoc)
此方法用于向方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件)
可以为JCheckBox JComboBox JTextArea 等
@see javaxswingtableTableCellRenderer#getTableCellRendererComponent(javaxswingJTable, javalangObject, boolean, boolean, int, int)
/
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// 创建用于返回的渲染组件
JCheckBox ck = new JCheckBox();
// 使具有焦点的行对应的复选框选中
cksetSelected(isSelected);
// 设置单选boxsetSelected(hasFocus);
// 使复选框在单元格内居中显示
cksetHorizontalAlignment((int) 05f);
return ck;
}});
// 方法二:先设置列编辑器,然后设置单元格渲染
// 设置列编辑器
// 在以复选框为对象设置列编辑器时,必须保证该列能够被编辑,否则无法更改状态
// (此步骤可以省略,省略时不要忘记将列设为不可编辑)
// tablegetColumnModel()getColumn(1)setCellEditor(new DefaultCellEditor(new JCheckBox()));
// 设置单元格渲染(这里是设置表格级别的渲染)
/tablesetDefaultRenderer(Objectclass, new TableCellRenderer(){
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
// 判断是否为需要渲染的列
if(column == 1){
// 和方法一基本一致
JCheckBox box = new JCheckBox();
boxsetSelected(isSelected);
// 设置单选boxsetSelected(hasFocus);
boxsetHorizontalAlignment((int) CENTER_ALIGNMENT); // 05f
return box;
}
// 如果不是需要渲染的列,封装文本域显示数据
return new JTextArea(valuetoString());
}});/
// 在多选是需要按住Ctrl键或者鼠标按住拖过连续的需要选中的行,应该给用户说明
// 第一种方法是被推荐的,因为它具有选中的高亮显示,界面能更加友好
tablesetSize(panelgetWidth(),panelgetHeight() - 90);
tablesetLocation(0, 0);
btn = new JButton("Test");
btnsetSize(80,40);
btnsetLocation((panelgetWidth()) / 2 - 40, panelgetHeight() - 80);
// 按钮点击时显示当前选中项
btnaddActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
for(int rowindex : tablegetSelectedRows()){
JOptionPaneshowMessageDialog(null, rowindex + " " + tablegetValueAt(rowindex, 0));
}
}});
paneladd(table);
paneladd(btn);
thisadd(panel);
}
// 定义一些必要的组件
private JPanel panel;
private JTable table;
private JButton btn;
}这个可以用MouseListener来监听。
tableaddMouseListener();
//括号内的东西根据实际填写
……
public
void
mouseClicked(MouseEvent
e)
{
int
index=tablegetSelectedRow();
String
code=(String)tablegetValueAt(index,0);//这一句是取出表格选中那行的第一列
text1setText(code);
//其他列的数据类似,不逐一说明,自己研究即可。
}第一种方法:
按照你的数据模型l转成二维数组 String[][] 直接放入jtable构造器里就可以了吧new jtable(st);
第二种方法:
另外实现方法最好自定义一个Model,这个也不难
你是想是实现,在某一列可以显示时间, 并且点击时间后面的图标可以显示时间选择器,然后选择时间吧
1,写一个MyModel继承与AbstractTableModel: 用于当数据模型, 填充数据,删除数据等
2,写一个MyRenderer实现TableCellRenderer 主要实现getTableCellRendererComponent方法 用于返回一个外观, 这就是日期列的渲染器 可以渲染该列看起来的样子,比如看起来就是一个文本框,里面的文字是xx年xx月xx日
3,写一个MyEditor实现TableCellEditor接口, 也需要重写getTableCellEditorComponent等方法, 这就是日期列的编辑器, 就是当点击日期列时, 处于编辑状态时的状态,显示日期选择器 选择好时间后, 文本框的文字变成了cc年cc月cc日
比如可以把性别列渲染成单选按钮组, 兴趣列渲染成复选框如下
String[] columnNames = {"第一列", "第二列"}; //定义列字段信息Object[][] cellData = {{"11", "12"},{"21", "22"}}; //定义表格数据字段
JTable table = new JTable(cellData, columnNames);
然后可以直接将这个table添加到指定的容器上,例如有一个JFrame对象f,可以通过fadd(table)的方式来添加。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)