Java 在JTable中单击JButton,并想知道他们单击的行
在最后一列中,我在JTable中有一个JButton,当客户端单击它时,它将显示一个JFrame。但是我不知道如何获取行以便获取行中的对象并将其发送给JFrame构造函数 这是我的桌子:Java 在JTable中单击JButton,并想知道他们单击的行,java,swing,jtable,jbutton,tablecelleditor,Java,Swing,Jtable,Jbutton,Tablecelleditor,在最后一列中,我在JTable中有一个JButton,当客户端单击它时,它将显示一个JFrame。但是我不知道如何获取行以便获取行中的对象并将其发送给JFrame构造函数 这是我的桌子: table = new JTable(model); JTableHeader tableHeader = table.getTableHeader(); tableHeaderRenderer = table.getTableHeader().getDefaultRenderer();
table = new JTable(model);
JTableHeader tableHeader = table.getTableHeader();
tableHeaderRenderer = table.getTableHeader().getDefaultRenderer();
tableHeader.setDefaultRenderer(new TableCellRenderer() {
private JLabel label;
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (selectedColumn == value) {
label = (JLabel) tableHeaderRenderer.getTableCellRendererComponent(table,
value, true, true, row, column);
label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
label.setBorder(BorderFactory.createCompoundBorder(label.getBorder(),
BorderFactory.createEmptyBorder(0, 5, 0, 0)));
label.setHorizontalAlignment(SwingConstants.LEFT);
} else {
label = (JLabel) tableHeaderRenderer.getTableCellRendererComponent(table,
value, false, false, row, column);
label.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
label.setBorder(BorderFactory.createCompoundBorder(label.getBorder(),
BorderFactory.createEmptyBorder(0, 5, 0, 0)));
label.setHorizontalAlignment(SwingConstants.CENTER);
}
return label;
}
});
table.getColumnModel().getColumn(3).setCellRenderer(new TableCellRenderer() {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JPanel buttonPanel = new JPanel(new BorderLayout());
buttonPanel.setBackground(Color.white);
JButton button = Shorter.button("Details", true);
buttonPanel.add(button);
return buttonPanel;
}
});
table.getColumnModel().getColumn(3).setCellEditor(new TableCellEditor() {
public boolean stopCellEditing() {return false;}
public boolean shouldSelectCell(EventObject arg0) {return false;}
public void removeCellEditorListener(CellEditorListener arg0) {}
public boolean isCellEditable(EventObject arg0) {return true;}
public Object getCellEditorValue() {return null;}
public void cancelCellEditing() {}
public void addCellEditorListener(CellEditorListener arg0) {}
public Component getTableCellEditorComponent(JTable arg0, Object arg1,
boolean arg2, int arg3, int arg4) {
JFrame frame = new JFrame();
frame.setVisible(true);
return null;}
});
加载帧时,我想知道选择了哪一行添加到帧构造函数
但是我不知道怎样才能得到行,这样才能得到行中的对象
行并将其发送给JFrame构造函数
有三种选择
JTable中最后一列中JTable内的按钮的事件
必须从JTables视图
返回正确的坐标,如果JTables视图
为
- 分类
- 过滤
- 列已重新排序
- 列被隐藏(从JTables视图中删除)
ListSelectionListener
添加到JTable
鼠标事件
也可以返回,请阅读Oracle官方教程《如何使用表格-为单元格指定工具提示》,了解工作代码示例不久前,我写了一个简单的
按钮栏
,我认为它可以帮你一点忙,但正如@mKorbel提到的,你必须解决排序、过滤等问题
用下一种方法将其设置为您的列:
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellEditor(new ButtonColumn());
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellRenderer(new ButtonColumn());
有关为您提供行的解决方案,请参阅。您所需要做的就是为它提供一个
操作
显示一些代码。你已经试过什么了?我添加了我的表代码,我想我应该编辑我的数据。。。你这么认为吗?@尖锐的简单而简短的问题,为什么你要创建一个从TableCellEditor调用的新JFrame,请问真正的目标是什么,这段代码对我毫无帮助,从@camickr,simple开始,代码清晰无副作用我想在表格中显示一些关于消息或字母的详细信息,当客户点击详细信息时,框架将向他显示完整消息或完整字母的详细信息1。代码标签引擎出现了一些问题,今天我看到了几次,2。不确定这是否是一种方式:-),因为JTable知道它的列和行的坐标,所以我通过删除第一行和最后一行上的空格,再次将代码标记和格式手动放在那里,通常我必须在meta SO上公布这个问题,但我无休止的懒散……我这样做:JButton[]buttons=new JButton[messages.size()];对于(i=0;如果你是怎么做的代码?我不明白。如果你想为所有行使用不同的侦听器,请尝试从按钮中删除侦听器,并为当前行添加新的侦听器。我该怎么做?我在这个站点中找到一些代码,但当我运行这些代码并单击一行时,侦听器会运行两次,我不知道为什么。你对此有什么想法,或者你能给出一些建议吗给我一个示例代码?我真的很困惑在java中使用表:|我认为当我要向数据添加按钮时,我应该向它们添加ActionListener,但现在我无法测试它,因为我的代码还没有完成。你认为它会工作吗?为什么?
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellEditor(new ButtonColumn());
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellRenderer(new ButtonColumn());