细胞渲染器和失去的焦点

时间:2014-11-24 14:54:42

标签: java swing jtable

我正在使用JTable并更改数字格式。我扩展了DefaultTableRenderer类。

在方法getTableCellRenderedComponent中,我使用正确的格式重新启动新的JLabel。 我的问题是通过这样做的矩形(边框)加强了焦点消失的单元格。

当单元格具有我的自定义渲染焦点时,是否有办法显示默认边框?

2 个答案:

答案 0 :(得分:2)

  

为了改变数字的格式。我扩展了DefaultTableRenderer类。

当您需要做的就是格式化数据时,请查看Table Format Renderers以便更轻松地自定义渲染器。也就是说,您应该覆盖setValue(...)方法而不是getTableCellRenderer(...)方法。

答案 1 :(得分:1)

如果您使用DefaultTableRenderer,则可以调用super()方法并从返回的组件中获取Border。试试下一个例子:

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

public class TestFrame extends JFrame {

    public TestFrame() {
        init();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void init() {
        JTable t = new JTable(3,3);
        t.getColumnModel().getColumn(0).setCellRenderer(getRenderer());
        add(new JScrollPane(t));
    }

    private TableCellRenderer getRenderer() {
        return new DefaultTableCellRenderer(){

            private JLabel l = new JLabel();
            {
                l.setOpaque(true);
            }

            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus,
                    int row, int column) {
                JComponent tableCellRendererComponent = (JComponent) super.getTableCellRendererComponent(table, value, isSelected, hasFocus,row, column);
                l.setText(value == null ? "" : value.toString());
                l.setBorder(tableCellRendererComponent.getBorder());
                l.setBackground(tableCellRendererComponent.getBackground());
                l.setForeground(tableCellRendererComponent.getForeground());
                return l;
            }
        };
    }

    public static void main(String... s){
        new TestFrame();
    }

}