简体   繁体   English

JTable中的Clickable JButton,想知道他们点击的行

[英]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 有三种选择

  1. 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视图中删除)

  2. (and/or with) add ListSelectionListener to JTable (和/或)将ListSelectionListener添加到JTable

  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM