我有一个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;对于边界(即组件仍然与表所在的表一起伸展)。任何帮助设置渲染组件的常量大小都将非常感激。
答案 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;
}