动态生成的JButton的actionEvent无法正常工作

时间:2015-07-07 16:25:21

标签: java swing jtable jbutton tablecellrenderer

我正在动态添加按钮。 当我点击该按钮时,动作应该执行,我需要点击哪个按钮的值。

import java.awt.Component;
import java.awt.Font;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CustomCell {
    public static void main( String [] args ) { 
        Object [] columnNames = new Object[]{ "Id", "Quantity" };
        Object [][] data        = new Object[][]{ {"06", 1}, {"08", 2} };

        JTable table = new JTable( data, columnNames ) { 
            public TableCellRenderer getCellRenderer( int row, int column ) {
                return new PlusMinusCellRenderer();
            }
         };

        table.setRowHeight( 32 );
        showFrame( table );
    }

    private static void showFrame( JTable table ) {
        JFrame f = new JFrame("Custom Cell Renderer sample" );
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.add( new JScrollPane( table ) );
        f.pack();
        f.setVisible( true );
    }
}

class PlusMinusCellRenderer extends JPanel implements TableCellRenderer {
        public Component getTableCellRendererComponent(
                            final JTable table, Object value,
                            boolean isSelected, boolean hasFocus,
                            int row, int column) {

                JButton jb= new JButton("Edit");
                this.add(jb);
                jb.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        System.out.println("Clicked !");
                    }
                });

                return this;
        }


}

在上述行动中根本没有召唤。可以帮助我解决2件事情。 1)应该调用actionPerformed方法.. 2)我需要获取点击行的值。

1 个答案:

答案 0 :(得分:2)

您会注意到,不仅没有调用ActionListener,而且按钮也从不显示自己被推送。原因是JTable单元格渲染器只显示图像而已,不再是Swing组件,它不能显示可推送的JButton,因此无法通过使用单元格渲染器来解决您的问题。另一方面,单元格编辑器可以,您可能希望走这条路线。