【问题标题】:How to add button in a row of JTable in Swing java如何在 Swing java 中的 JTable 行中添加按钮
【发布时间】:2010-12-01 07:47:57
【问题描述】:

我制作了一个带有 JTable 的摇摆 GUI,其中包含一些行和列。我应该如何在 JTable 中的行中添加一个按钮?

【问题讨论】:

    标签: java swing jtable


    【解决方案1】:

    查看Table Button Column

    它演示了如何将 JButton 用作自定义渲染器和编辑器,您可以单击它们轻松调用 Action

    【讨论】:

      【解决方案2】:

      您可以将组件添加为表格单元格。

      首先,你应该实现一个以JButton为父类和两个接口的类:TableCellRendererTableCellEditor

      它应该实现TableCellEditor的原因是为了接收按钮的ActionEvent

          public class TableButton extends JButton implements TableCellRenderer, TableCellEditor {
            private int selectedRow;
            private int selectedColumn;
            Vector<TableButtonListener> listener;
          
            public TableButton(String text) {
              super(text); 
              listener = new Vector<TableButtonListener>();
              addActionListener(new ActionListener() { 
                public void actionPerformed( ActionEvent e ) { 
                  for(TableButtonListener l : listener) { 
                    l.tableButtonClicked(selectedRow, selectedColumn);
                  }
                }
              });
            }
           
            public void addTableButtonListener( TableButtonListener l ) {
              listener.add(l);
            }
          
            public void removeTableButtonListener( TableButtonListener l ) { 
              listener.remove(l);
            }
          
            @Override 
            public Component getTableCellRendererComponent(JTable table,
              Object value, boolean isSelected, boolean hasFocus, int row, int col) {
              return this;
            }
          
            @Override
            public Component getTableCellEditorComponent(JTable table,
                Object value, boolean isSelected, int row, int col) {
              selectedRow = row;
              selectedColumn = col;
              return this;
            } 
          
            @Override
            public void addCellEditorListener(CellEditorListener arg0) {      
            } 
          
            @Override
            public void cancelCellEditing() {
            } 
          
            @Override
            public Object getCellEditorValue() {
              return "";
            }
          
            @Override
            public boolean isCellEditable(EventObject arg0) {
              return true;
            }
          
            @Override
            public void removeCellEditorListener(CellEditorListener arg0) {
            }
          
            @Override
            public boolean shouldSelectCell(EventObject arg0) {
              return true;
            }
          
            @Override
            public boolean stopCellEditing() {
              return true;
            }
          }
      

      然后我添加了一个EventListener named TableButtonListener` 用于处理按钮事件,如下所示。

          public interface TableButtonListener extends EventListener {
            public void tableButtonClicked( int row, int col );
          }
      

      并使用上面的渲染器/编辑器。

          TableButton buttonEditor = new TableButton("Button");
          buttonEditor.addButtonListener(new TableButtonListener() {
            @Override
            public void tableButtonClicked(int row, int col) {
              // do something 
            }     
          }); 
           
          TableColumn col = new TableColumn(1, 80);
          col.setCellRenderer(buttonEditor);
          col.setCellEditor(buttonEditor);
      
          cols.addColumn(colPattern);
      

      如果你想为每一行显示不同的按钮标签,你应该在getTableCellRendererComponentgetTableCellEditorComponent方法中插入一个代码块来修改按钮的标签。

      【讨论】:

      • -1 这是 CellEditor 的非法实现:根据合同,它必须通知已注册的 CellEditorListener。对于 addEditorListener 的空实现,它微不足道;-) 超级合约 必须 由实现提供服务,没有办法。
      • 如果您在同一个表中有多个按钮,(就像您将其设置为列的渲染器一样)这将出现渲染问题,因为所有按钮都是同一个实例。它会做一些奇怪的事情,比如无法绘制按钮的一部分,只绘制白色背景,或者绘制多个按钮而不是一个突出显示的按钮。我通过分离为两个单独的类 TableButton 和 TableButtonEditor 解决了这个问题。我根据行和列索引跟踪哈希图中的多个按钮。
      • 只想说我爱你。完美运行!
      【解决方案3】:

      您不会将其添加到行中 - 您将其添加到单元格中。 This tutorial 描述了您的需求。

      【讨论】:

      • 哇!我刚刚打开了那个例子,发现源代码向 CellEditor 添加了一个“新的 JCheckbox”。但实际上它呈现为 JButton。无论如何,我的问题是,我们为什么要把 JCheckBox 放进去呢? :(
      • @Bostone - 如何将不同单元格中的数据作为参数发送到按钮触发的函数? --- 这个例子只显示了正在使用的单元格自己的数据,所以我有点迷路了。
      • @om。如果此答案解决了您的问题,请点击旁边的复选标记。
      • 这似乎没有为我显示按钮点击动画。
      • @ThomasAhle 我也面临一些问题。有什么解决办法吗?
      猜你喜欢
      • 2023-03-30
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2011-08-20
      • 2014-06-18
      • 2020-09-29
      相关资源
      最近更新 更多