【问题标题】:create a JButton in JTable在 JTable 中创建一个 JButton
【发布时间】:2023-03-24 02:20:01
【问题描述】:

在我的小项目中,我正在解析一些日志文件并显示在 JTable 上。在 Jtable 中有 2 列。

第二列是 for => 显示搜索语句 第一列是 for => 显示这句话在哪里(在哪个日志文件中?)

我的结果屏幕截图。

现在,我的问题是,我想将 JButtons 放在第一列。但是当我期待显示 Jbutton 时,我不能。

这是我的代码:

import java.awt.ComponentOrientation;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class ResultGui 
{
    public final static boolean RIGHT_TO_LEFT = false;
    private static JButton but;
    private static JTable table;
    public static void addComponentsToPane(Container contentPane,List<String> result, List<String>      logFiles) 
    {
       if (RIGHT_TO_LEFT)
       {
        contentPane.setComponentOrientation(
        ComponentOrientation.RIGHT_TO_LEFT);
       }
       contentPane.setLayout(new GridLayout(0,1));
       //list to array
       String[] data = result.toArray(new String[result.size()]);
       DefaultTableModel dm = new DefaultTableModel();
       Object [][] objectArray = new Object[logFiles.size()][result.size()];
       for(int i=0; i<logFiles.size(); i++)
       {
         but = new JButton("LogFile");
         but.setToolTipText(logFiles.get(i));;
         but.setOpaque(true);
         objectArray [i][0] = but;
         //objectArray [i][0] = logFiles.get(i);
         i++;
         objectArray [i][0] = "";
        }    
       for(int i=0; i<result.size(); i++)
       {
         objectArray[i][1] = result.get(i);
       } 
       dm.setDataVector(objectArray, new Object[] { "LOGFILES", "RESULTS" });
       //dm.addColumn("deneme", strArray2Vector(data));  
       table = new JTable(dm);
       TableColumn columnA = table.getColumn("LOGFILES");
       columnA.setMinWidth(30);
       columnA.setMaxWidth(100);
       JScrollPane scrollPane = new JScrollPane(table,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
       contentPane.add(scrollPane);
    }

    public static void createAndShowGUI(List<String> stringList, List<String> logFiles)   
    {
      JFrame.setDefaultLookAndFeelDecorated(true);
      JFrame frame = new JFrame("Result Screen");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      //Set up the content pane and components in GridLayout
      addComponentsToPane(frame.getContentPane(),stringList,logFiles);
      frame.setSize(1000,500);
      //frame.pack();
      frame.setVisible(true);
    }
}

我应该怎么做才能在我的表格中成功创建 Jbutton ? 感谢任何示例、提示或建议。

【问题讨论】:

标签: java swing jtable jbutton


【解决方案1】:

我想把 JButtons 放在第一列

以您对任何其他列的方式为模型添加文本。然后你可以使用Table Button Column 来渲染和处理按钮点击。

【讨论】:

    【解决方案2】:

    展示方式如下

    table.setDefaultRenderer(JComponent.class, new MyTableCellRenderer());
    table.setDefaultEditor(JComponent.class, new MYTableCellEditor());
    
    
    class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
        private static final long serialVersionUID = 1L;
    
        public Component getTableCellRendererComponent(JTable table,
            Object value, boolean isSelected, boolean hasFocus, int row,
            int column) {
            return (JComponent)value;
        }
    }
    
    class PFTableCellEditor extends AbstractCellEditor implements TableCellEditor {
        private static final long serialVersionUID = 1L;
        private JComponent item;
    
        @Override
        public Object getCellEditorValue() {
            return item;
        }
    
        @Override
        public Component getTableCellEditorComponent(JTable table,
            Object value, boolean isSelected, int row, int column) {
            item = (JComponent)value;
            item.setBackground(table.getSelectionBackground());
            return item;
        }       
    }
    

    最后一个

    table.setModel(new DefaultTableModel() {    
        public boolean isCellEditable(int row, int column) {
                return column == 0;
        };
    };
    

    使用此 JTABLE 设置,您可以直接将您的 jbutton 作为单元格内容

    【讨论】:

    • 我想知道被否决的原因......我想我下次不会回答这些人的任何原因......
    • 好吧,我没有投反对票,但这不是一个好的解决方案。您不应该将 Swing 组件添加到 TableModel。使用渲染器的全部意义在于使用一个 Swing 组件来渲染 TableModel 中的文本。如果这个表有 1000 行,那么在 TableModel 中存储 1000 个 JButton 会非常低效。因此,这种方法表明对渲染器/编辑器的设计方式缺乏理解,以便与 JTable 和其他使用渲染器的 Swing 组件一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多