Java 从默认值仅更改1个JTable列渲染器

Java 从默认值仅更改1个JTable列渲染器,java,jtable,Java,Jtable,您好,我有以下情况,我想将JTable中的所有列都设置为特定的渲染器(居中),并希望最右边的列的背景色为黄色。我已尝试使用以下代码: public class LView extends JInternalFrame { private static final long serialVersionUID = -4248667075312220111L; private LModel model; private JPanel mainPanel; private JButton btnRef

您好,我有以下情况,我想将JTable中的所有列都设置为特定的渲染器(居中),并希望最右边的列的背景色为黄色。我已尝试使用以下代码:

public class LView extends JInternalFrame {

private static final long serialVersionUID = -4248667075312220111L;
private LModel model;
private JPanel mainPanel;
private JButton btnRefresh;

private JTable lTable;
private DefaultTableModel lTableModel;

private String [] columnNames = {"col1", "col2", "col3", "col4", "col5"};


public LView() {
    super("L Title", true, true, true, true);
    setSize(650,300);

    mainPanel = new JPanel(new FlowLayout());
    JPanel topPanel = new JPanel();

    btnRefresh = new JButton("Refresh");
    btnRefresh.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            try { model.refresh(); }
            catch (Exception e) { model.logException(e); }
        }
    });

    topPanel.add(btnRefresh);

    lTableModel = new DefaultTableModel() {
        private static final long serialVersionUID = 2130745775009581358L;

        @Override
        public boolean isCellEditable(int row, int col) { 
            return false; 
        }
    };

    for (String col : columnNames)
        lTableModel.addColumn(col);

    lTable = new JTable();

    DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
    centerRenderer.setHorizontalAlignment( SwingConstants.CENTER );
    lTable.setDefaultRenderer(Object.class, centerRenderer);

    DefaultTableCellRenderer estColumnRenderer = new DefaultTableCellRenderer();
    estColumnRenderer.setBackground(java.awt.Color.YELLOW);
    estColumnRenderer.setFont(new Font(null, Font.BOLD, 12));
    estColumnRenderer.setHorizontalAlignment( SwingConstants.CENTER );

    lTable.setModel(lTableModel);
    lTable.getColumnModel().getColumn(columnNames.length-1).setCellRenderer(estColumnRenderer);


    lTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    lTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
    lTable.getColumn(columnNames[0]).setPreferredWidth(225);

    JScrollPane scrollPane = new JScrollPane(lTable);

    JPanel tablePanel = new JPanel();
    tablePanel.add(scrollPane);

    mainPanel.add(topPanel);
    mainPanel.add(tablePanel);
    add(mainPanel);
}

public LModel getModel() {
    return model;
}

public void setModel(LModel model) {
    this.model = model;

}

public void addData(List<Object []> dataList) throws Exception {

    lTableModel.getDataVector().removeAllElements();
    lTableModel.fireTableDataChanged();

    for (Object [] data : dataList) {

        lmeTableModel.addRow(new Object[] {data[0], 
                                        data[1],
                                        data[2],
                                        data[3],
                                        data[4]});
    }

    lTable.setPreferredScrollableViewportSize(lTable.getPreferredSize());
    lTable.setFillsViewportHeight(true);
    lTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);

    lTableModel.fireTableStructureChanged();
}   
public类LView扩展了JInternalFrame{
私有静态最终长serialVersionUID=-424866707531220111L;
私有模型;
私人JPanel主面板;
私人JButton btnRefresh;
私有JTable和lttable;
私有DefaultTableModel lTableModel;
私有字符串[]columnNames={“col1”、“col2”、“col3”、“col4”、“col5”};
公共LView(){
超级(“L标题”,真,真,真,真);
设置大小(650300);
mainPanel=newjpanel(newflowlayout());
JPanel-topPanel=新的JPanel();
btnRefresh=新的JButton(“刷新”);
btnRefresh.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件arg0){
请尝试{model.refresh();}
catch(异常e){model.logException(e);}
}
});
topPanel.add(btnRefresh);
lTableModel=新的DefaultTableModel(){
私有静态最终长serialVersionUID=2130745775009581358L;
@凌驾
公共布尔值isCellEditable(int行,int列){
返回false;
}
};
for(字符串列:列名称)
lTableModel.addColumn(col);
lTable=新的JTable();
DefaultTableCellRenderer centerRenderer=新的DefaultTableCellRenderer();
centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setDefaultRenderer(Object.class,centerRenderer);
DefaultTableCellRenderer estColumnRenderer=新的DefaultTableCellRenderer();
setBackground(java.awt.Color.YELLOW);
setFont(新字体(null,Font.BOLD,12));
estColumnRenderer.setHorizontalAlignment(SwingConstants.CENTER);
setModel(lTableModel);
lTable.getColumnModel().getColumn(columnNames.length-1).setCellRenderer(estColumnRenderer);
lTable.setSelectionMode(ListSelectionModel.SINGLE_选择);
lTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
lTable.getColumn(columnNames[0]).setPreferredWidth(225);
JScrollPane scrollPane=新的JScrollPane(lTable);
JPanel tablePanel=新的JPanel();
tablePanel.add(滚动窗格);
主面板。添加(topPanel);
主面板。添加(tablePanel);
添加(主面板);
}
公共LModel getModel(){
收益模型;
}
公共模型(L模型){
this.model=模型;
}
public void addData(List dataList)引发异常{
lTableModel.getDataVector().removeAllElements();
lTableModel.fireTableDataChanged();
对于(对象[]数据:数据列表){
lmeTableModel.addRow(新对象[]{data[0],
数据[1],
数据[2],
数据[3],
数据[4]};
}
setPreferredScrollableViewportSize(lTable.getPreferredSize());
lTable.setFillsViewportHeight(true);
lTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
lTableModel.fireTableStructureChanged();
}   
}

它将所有列设置为顶部的“centerRenderer”,但最后一列不会以任何方式更改。我错过什么了吗?谢谢-


编辑:完整代码
列名。长度1
1
从何而来?如果传递
columnNames
数组的长度,则
ArrayIndexOutOfBoundsException
应该是thrownCode,对我来说很好。当然,这假设您使用的是
columnNames.length-1
。您发布的代码似乎有输入错误。除非指定有效列,否则将出现运行时异常。发表一篇文章来说明你的问题。你最后的评论是什么意思???您已经被告知代码是有效的。因此,问题在于您的代码,而您尚未发布
SSCCE
,因此我们无法提供帮助。我们不是读心术的人,当我们看不到演示问题的代码时,我们无法猜测您的代码出了什么问题。