【问题标题】:How to modify javax.swing.TreeCellRenderer in order to stroke the text in the cell如何修改 javax.swing.TreeCellRenderer 以描边单元格中的文本
【发布时间】:2018-04-18 10:32:14
【问题描述】:

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

【问题讨论】:

    标签: java swing text stroke treecellrenderer


    【解决方案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;
            }
        }
    }
    

    【讨论】:

    • 非常感谢!我正在寻找第二种解决方案。显然它也可以在其他渲染器中使用。
    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 2016-12-26
    • 2019-07-21
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2019-10-31
    • 2017-06-08
    相关资源
    最近更新 更多