JAVA中在Jtable中增加一列按钮,并且点击按钮能捕捉事件。应该怎么增加?

JAVA中在Jtable中增加一列按钮,并且点击按钮能捕捉事件。应该怎么增加?,第1张

import java.awt.Component\x0d\x0aimport java.awt.event.ActionEvent\x0d\x0aimport java.awt.event.ActionListener\x0d\x0a\x0d\x0aimport javax.swing.*\x0d\x0aimport javax.swing.table.*\x0d\x0a\x0d\x0apublic class ButtonTable extends JFrame{\x0d\x0a\x0d\x0aprivate static final long serialVersionUID = 1L\x0d\x0aprivate JTable table = null\x0d\x0aprivate DefaultTableModel model=null\x0d\x0aprivate JScrollPane js=null \x0d\x0apublic ButtonTable(){\x0d\x0amodel = new DefaultTableModel(3,3)\x0d\x0atable = new JTable(model)\x0d\x0atable.getColumnModel().getColumn(1).setCellEditor(new MyRender())//设置编辑器\x0d\x0atable.getColumnModel().getColumn(1).setCellRenderer(new MyRender() )\x0d\x0ajs = new JScrollPane(table)\x0d\x0a\x0d\x0athis.add(js)\x0d\x0athis.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)\x0d\x0athis.setVisible(true)\x0d\x0athis.setSize(399, 300)\x0d\x0athis.setLocationRelativeTo(null)\x0d\x0a}\x0d\x0a\x0d\x0apublic static void main(String[] args) {\x0d\x0a// TODO Auto-generated method stub\x0d\x0anew ButtonTable()\x0d\x0a}\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0a/芹闷/渲染坦首芹 器让毕 编辑器\x0d\x0aclass MyRender extends AbstractCellEditor implements TableCellRenderer,ActionListener, TableCellEditor{\x0d\x0a\x0d\x0aprivate static final long serialVersionUID = 1L\x0d\x0aprivate JButton button =null\x0d\x0apublic MyRender(){\x0d\x0abutton = new JButton("确定不?")\x0d\x0abutton.addActionListener(this)\x0d\x0a}\x0d\x0a\x0d\x0a@Override\x0d\x0apublic Object getCellEditorValue() {\x0d\x0a// TODO Auto-generated method stub\x0d\x0areturn null\x0d\x0a}\x0d\x0a\x0d\x0a@Override\x0d\x0apublic Component getTableCellRendererComponent(JTable table, Object value,\x0d\x0aboolean isSelected, boolean hasFocus, int row, int column) {\x0d\x0a// TODO Auto-generated method stub\x0d\x0areturn button\x0d\x0a}\x0d\x0a\x0d\x0a@Override\x0d\x0apublic void actionPerformed(ActionEvent e) {\x0d\x0a// TODO Auto-generated method stub\x0d\x0aJOptionPane.showMessageDialog(null, "渲染器学期", "消息", JOptionPane.OK_OPTION)\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0a@Override\x0d\x0apublic Component getTableCellEditorComponent(JTable table, Object value,\x0d\x0aboolean isSelected, int row, int column) {\x0d\x0a// TODO Auto-generated method stub\x0d\x0areturn button\x0d\x0a}\x0d\x0a\x0d\x0a}

就是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

你要设计的这个单选按钮应该不是说一个表里同时只能选一行吧。。。那你最好还是用checkbox复选框的显示方法替代单选按钮吧。。。因为单选按钮是没有办法点击取消的,一旦选中,就没有办法取消了。。。多蛋疼啊。。。

给你一个复选框的例子吧,一样很好用的。

不多说了,直接上代码:

import java.awt.BorderLayout

import java.awt.Dimension

import java.awt.FlowLayout

import java.awt.Toolkit

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JPanel

import javax.swing.JScrollPane

import javax.swing.JTable

import javax.swing.table.DefaultTableModel

import javax.swing.table.TableColumn

public class CheckedBoxTabel extends JFrame {

private JTable table

private JScrollPane sPane

private DefaultTableModel model

private JButton button, button2

private JPanel pane

public CheckedBoxTabel() {

//孙高神腔 TODO Auto-generated constructor stub

//窗口设置,不用管

this.setSize(400, 400)

Toolkit toolkit = Toolkit.getDefaultToolkit()

Dimension scrnsize

scrnsize = toolkit.getScreenSize()

setLocation(scrnsize.width / 2 - getWidth() / 2, scrnsize.height / 2

- getHeight() / 2)

this.setDefaultCloseOperation(EXIT_ON_CLOSE)

//table的model设置

model = new DefaultTableModel(new Object[][] {}, new String[] { "论文ID",

"论文标题", "是否提交", "论文负责人" })

//table加载model

table = new JTable(model)

//将第三列的显示设为checkbox类型,楼主想设置哪列自己决定

//但是记得该列的值是Boolean型的

TableColumn tc = table.getColumnModel().getColumn(2)

tc.setCellEditor(table.getDefaultEditor(Boolean.class))

tc.setCellRenderer(table.getDefaultRenderer(Boolean.class))

sPane = new JScrollPane()

sPane.setViewportView(table)

//添则瞎尺加增添一行按钮的事件处理

button = new JButton("加一行")

button.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

model = (DefaultTableModel) table.getModel()

Object[] data = new Object[4]

data[0] = "1"

data[1] = "论文"

data[2] = new Boolean(false)

data[3] = "张三"

model.addRow(data)

/*

//或者也可以用

model.addRow(new Object[]{"1","论文",new Boolean(false),"张三"})

*/

table.setModel(model)

}

})

//添加显示所选行的按钮的事件处理

button2 = new JButton("显示所选行")

button2.addActionListener(new ActionListener() {

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

model = (DefaultTableModel) table.getModel()

int count = model.getRowCount()

for (int i = 0i <counti++) {

if (model.getValueAt(i, 2).equals(true)){

//在这里添加你要处理行的方法

System.out.println("第" + (i + 1) + "行被选中")

}

}

}

})

pane = new JPanel()

pane.setLayout(new FlowLayout())

pane.add(button)

pane.add(button2)

this.add(sPane, BorderLayout.CENTER)

this.add(pane, BorderLayout.SOUTH)

}

public static void main(String[] args) {

new CheckedBoxTabel().setVisible(true)

}

}

我设计的测试结果是在控制台输出的,楼主可以自己修改:

第4行被选中

第7行被选中

第8行被选中

第10行被选中


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11975284.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存