减少JTable单元格中自定义渲染组件的大小

时间:2014-08-26 08:25:23

标签: java swing jtable jbutton tablecellrenderer

我有一个JTable,其中最后一列显示自定义单元格渲染器(JButton)。是否可以在其列的列中减小JButton的宽度,使其仅足以显示它的文本?我宁愿不减小列本身的大小,除非这是唯一的解决方案。我尝试过但失败的方法是:

  • 设置空白边框
  • 设置首选尺寸
  • 添加保证金

自定义渲染器的代码如下所示:

import java.awt.Component;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class ButtonColumnRenderer extends JButton implements TableCellRenderer {

    public ButtonColumnRenderer(){
      //  this.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
      //  this.setPreferredSize(new Dimension(10,10));
      //  this.setMargin(new Insets(20,20,20,20));
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
        return this;
    }
}

自定义渲染组件可以按如下方式使用:

    import javax.swing.*;
    import javax.swing.table.*;

    public static void main(String[] args){
        //setup data + column headers
        String[] columns = {"Text Column", "Button Column"};
        Object[][] data = new Object[3][2];
        for(int i = 0; i < 3; i++){
            Object[] rowOfData = {"text" + i, "button" + i};
            data[i] = rowOfData;
        }   

        //Setup table
        DefaultTableModel model = new DefaultTableModel(data, columns);
        JTable table = new JTable(model);
        TableColumn column =  table.getColumnModel().getColumn(table.getModel().getColumnCount() - 1);
        column.setCellRenderer(new ButtonColumnRenderer(table.getModel().getRowCount()));

        //Display table on frame
        JFrame frame = new JFrame();
        frame.add(table);
        frame.pack();
        frame.setVisible(true);
    }

更新:我已设法使用与背景颜色相同的matteborder来减小组件的大小,但问题是没有一种尺寸适合所有&#39;对于边界(即组件仍然与表所在的表一起伸展)。任何帮助设置渲染组件的常量大小都将非常感激。

2 个答案:

答案 0 :(得分:1)

IIUC,你的问题是按钮填满了列。由于您正在使用的调整大小模式为列提供了更多空间,因此在调整表格大小时 - 您的按钮会有更多空间来填充。

如果您使用容器(在本例中为JComponent),您可以将问题视为“标准”布局问题,而不处理渲染器和表格:

public class ButtonColumnRenderer extends JComponent implements TableCellRenderer {

    private final JButton button;

    public ButtonColumnRenderer(){
        setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
        button = new JButton();
        add(Box.createHorizontalGlue());
        add(button);
        add(Box.createHorizontalGlue());
    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
        button.setText(String.valueOf(value));
        return this;
    }
}

我在这里的选择是使用BoxLayout。随意使用你最喜欢的物质。

答案 1 :(得分:0)

TableCellRenderer的组件被重用,因此最自定义的工作应该在getTableCellRenderComponent中进行。 (对于其他读者:通常可以从DefaultTableCellRenderer, but that uses a JLabel. That has the advantage that a call to super.getTableCellRenderer`派生出一个TableCellRenderer,为选择和焦点设置视觉效果。)

public ButtonColumnRenderer(){
}

public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column){
  //  this.setBorder(BorderFactory.createEmptyBorder(50, 50, 50, 50));
  //  this.setPreferredSize(new Dimension(10,10));
  //  this.setMargin(new Insets(20,20,20,20));
    this.setBorder(BorderFactory.createMatteBorder(1, 50, 1, 50,
        isSelected ? Color.RED : Color.GRAY));
    this.setSize(new Dimension(120, 10));
    return this;
}