[英]Clickable JButton in JTable, and want to know the row they have clicked
I have a JButton inside a JTable in the last column, and when client click on that, It will show a JFrame. 我在最后一列的JTable中有一个JButton,当客户端点击它时,它将显示一个JFrame。 But I don't know how I can get the row so I can get the object in the row and send it to JFrame constructor?
但我不知道如何获取行,所以我可以获取行中的对象并将其发送到JFrame构造函数?
it is my table: 这是我的表:
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;}
});
when frame loaded I want to know which row selected to add to frame constructor... 当帧加载时我想知道选择哪一行添加到帧构造函数中...
But I don't know how I can get the row so I can get the object in the row and send it to JFrame constructor?
但我不知道如何获取行,所以我可以获取行中的对象并将其发送到JFrame构造函数?
there are three choices 有三种选择
event from JButton inside a JTable in the last column
must to returs proper coordinates from JTables view
, you have to convert view to model in the case that JTables view
is 从事件
JButton inside a JTable in the last column
必须以returs从正确的坐标JTables view
,你必须转换鉴于该案件的模型JTables view
是
sorted 分类
filtered 过滤
column(s) is/are reordered 列被重新排序
column(s) is/are hidden (removed from JTables view) 列被隐藏(从JTables视图中删除)
(and/or with) add ListSelectionListener
to JTable
(和/或)将
ListSelectionListener
添加到JTable
Mouse Events
can returns that too, read official Oracle tutorial How to use Tables - Specifying Tool Tips for Cells
for working code example Mouse Events
也可以返回,阅读官方Oracle tutorial How to use Tables - Specifying Tool Tips for Cells
工作代码示例
I wrote a simple ButtonColumn
some time ago, I think it can help you a little, but as @mKorbel mentioned, you must to solve problems with sorting,filtering etc. 我前段时间写了一个简单的
ButtonColumn
,我认为它可以帮助你一点点,但正如@mKorbel所提到的,你必须解决排序,过滤等问题。
. 。
public class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor{
private JButton button;
private String value;
public ButtonColumn(){
button = new JButton();
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("pressed"+value);
}
});
}
@Override
public Component getTableCellRendererComponent(JTable arg0, Object arg1,
boolean arg2, boolean arg3, int arg4, int arg5) {
button.setText(arg4+"");
value = " "+arg4;
return button;
}
@Override
public Object getCellEditorValue() {
return null;
}
@Override
public Component getTableCellEditorComponent(JTable arg0, Object arg1,
boolean arg2, int arg3, int arg4) {
button.setText(arg3+"");
value = " "+arg3;
return button;
}
}
Set it to your column in next way: 以下一种方式将其设置为您的列:
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellEditor(new ButtonColumn());
table.getColumnModel().getColumn(YOUR_COLUMN_NUMBER).setCellRenderer(new ButtonColumn());
See Table Button Column for a solution that provides you with the row. 请参阅表按钮列以获取为您提供行的解决方案。 All you need to do is provide it with an
Action
. 您需要做的就是为它提供一个
Action
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.