0

有谁知道javax.swing.TreeCellRenderer应该如何修改 a 以便在单元格中描边文本?

4

1 回答 1

1

如果你想在某些列中画出文本,你应该使用渲染器。如果所有单元格都需要这种字体,您可以简单地修改表格的字体。以下是两种变体的示例:

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.font.TextAttribute;
import java.util.Collections;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

@SuppressWarnings("unchecked")
public class TableRendererTest {

    public static void main(String[] args) {
        JFrame frm = new JFrame("Renderer test");
        DefaultTableModel model = new DefaultTableModel(new String[] {"First", "Second", "Third" }, 3);
        model.setValueAt("Test String", 0, 0);
        model.setValueAt("Corner String", 2, 0);
        model.setValueAt("Last cell", 2, 2);

        // table with strike-out renderer (first column is stroked out)
        JTable tbl = new JTable(model);
        tbl.getColumnModel().getColumn(0).setCellRenderer(new StrikeOutRenderer());
        frm.add(new JScrollPane(tbl), BorderLayout.NORTH);

        // table with strike-out font (all cells are stroked out)
        JTable another = new JTable(model);
        another.setFont(
                another.getFont().deriveFont(Collections.singletonMap(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON)));
        frm.add(new JScrollPane(another), BorderLayout.SOUTH);
        frm.pack();
        frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frm.setLocationRelativeTo(null);
        frm.setVisible(true);
    }

    private static class StrikeOutRenderer extends DefaultTableCellRenderer {

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                int column) {
            Component res = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            res.setFont(res.getFont().deriveFont(Collections.singletonMap(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON)));
            return res;
        }
    }
}
于 2018-04-18T11:11:22.333 回答