java swing中在jTable中添加多个复选框的方式如下:
import java.awt.Componentimport java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.*
import javax.swing.table.*
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()
panel.setSize(this.getWidth(), this.getHeight())
panel.setLocation(0,0)
panel.setLayout(null)
// 初始化表格
table = new JTable(new DefaultTableModel(new Object[][]{{"第一行"},{"第二行"},{"第三行"},{"第四行"}}, new String[]{"测试行1","测试行2"}){
/* (non-Javadoc)
* 重写方法,判断表单元格是否可编辑
* 可以通过row和column索引判断某一个单元格是否可编辑
* 此处设为都不可编辑
* @see javax.swing.table.DefaultTableModel#isCellEditable(int, int)
*/
@Override
public boolean isCellEditable(int row, int column) {
return false
}
})
// 开始向表格中添加复选框(注意:此示例较为简单,缺省很多判断,也没有动态代码支持)
// 通过设置列渲染
// 方法一:直接方式 使用TableColumn的setCellRenderer方法(推荐)
// 此方法可以设置某一列的渲染(即使用某一个组件--即控件来显示单元格数据)
table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRenderer(){
/*(non-Javadoc)
* 此方法用于向方法调用者返回某一单元格的渲染器(即显示数据的组建--或控件)
* 可以为JCheckBox JComboBox JTextArea 等
* @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) {
// 创建用于返回的渲染组件
JCheckBox ck = new JCheckBox()
// 使具有焦点的行对应的复选框选中
ck.setSelected(isSelected)
// 设置单选box.setSelected(hasFocus)
// 使复选框在单元格内居中显示
ck.setHorizontalAlignment((int) 0.5f)
return ck
}})
// 方法二:先设置列编辑器,然后设置单元格渲染
// 设置列编辑器
// 在以复选框为对象设置列编辑器时,必须保证该列能够被编辑,否则无法更改状态
// (此步骤可以省略,省略时不要忘记将列设为不可编辑)
// table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(new JCheckBox()))
// 设置单元格渲染(这里是设置表格级别的渲染)
/*table.setDefaultRenderer(Object.class, 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()
box.setSelected(isSelected)
// 设置单选box.setSelected(hasFocus)
box.setHorizontalAlignment((int) CENTER_ALIGNMENT) // 0.5f
return box
}
// 如果不是需要渲染的列,封装文本域显示数据
return new JTextArea(value.toString())
}})*/
// 在多选是需要按住Ctrl键或者鼠标按住拖过连续的需要选中的行,应该给用户说明
// 第一种方法是被推荐的,因为它具有选中的高亮显示,界面能更加友好
table.setSize(panel.getWidth(),panel.getHeight() - 90)
table.setLocation(0, 0)
btn = new JButton("Test")
btn.setSize(80,40)
btn.setLocation((panel.getWidth()) / 2 - 40, panel.getHeight() - 80)
// 按钮点击时显示当前选中项
btn.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
for(int rowindex : table.getSelectedRows()){
JOptionPane.showMessageDialog(null, rowindex + " " + table.getValueAt(rowindex, 0))
}
}})
panel.add(table)
panel.add(btn)
this.add(panel)
}
// 定义一些必要的组件
private JPanel panel
private JTable table
private JButton btn
}
你可以先用一个JPanel,选择一种布局方式FlowLayout或者BorderLayout.向此JPanle中按布局添加多个JTable,然后再将此JPanel添加到JScrollPanel中即可.
就是JTable中,加入JButton对吧。那个简单。写一个类继承与JButton并实现javax.swing.table.TableCellRenderer接口就行了。然后用JTable的getColumn(Object)获取列,再用setCellRenderer(TableCellRenderer cellRenderer)方法就可以添加进表格了。
附相关API:
javax.swing.JTable
public TableColumngetColumn(Object identifier)返回表中列的 TableColumn 对象,当使用 equals 进行比较时,表的标识符等于
identifier。
参数:identifier - 标识符对象
返回:与标识符相匹配的 TableColumn 对象
javax.swing.table.TableCellRenderer
public interface TableCellRenderer
此接口定义了要成为 JTable 中单元格渲染器的任意对象所需的方法。
getTableCellRendererComponentComponentgetTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)返回用于绘制单元格的组件。此方法用于在绘制前适当地配置渲染器。
TableCellRenderer 还负责呈现表示该表当前 DnD 放置位置的单元格(如果有)。如果此呈现器负责呈现 DnD 放置位置,则它应该直接查询表以确定给定的行和列是否表示放置位置:
JTable.DropLocation dropLocation = table.getDropLocation()
if (dropLocation != null
&&!dropLocation.isInsertRow()
&&!dropLocation.isInsertColumn()
&&dropLocation.getRow() == row
&&dropLocation.getColumn() == column) {
// this cell represents the current drop location
// so render it specially, perhaps with a different color
}
在打印 *** 作期间,将调用此方法(isSelected 和 hasFocus 为
false)阻止选择和焦点在打印输出中出现。要根据是否打印表进行其他定制,检查 JComponent.isPaintingForPrint()
的返回值。
参数:table - 要求渲染器绘制的 JTable;可以为 nullvalue - 要呈现的单元格的值。由具体的渲染器解释和绘制该值。例如,如果 value 是字符串
"true",则它可呈现为字符串,或者也可呈现为已选中的复选框。null 是有效值
isSelected - 如果使用选中样式的高亮显示来呈现该单元格,则为 true;否则为 false
hasFocus - 如果为
true,则适当地呈现单元格。例如,在单元格上放入特殊的边框,如果可以编辑该单元格,则以彩色呈现它,用于指示正在进行编辑
row - 要绘制的单元格的行索引。绘制头时,row 值是 -1
column - 要绘制的单元格的列索引
javax.swing.table.TableColumn
public void setCellRenderer(TableCellRenderer cellRenderer)设置 JTable 用于绘制此列各值的 TableCellRenderer。
参数:cellRenderer - 新的 cellRenderer
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)