使用热键增加JTable中的字体大小

时间:2015-12-22 09:30:05

标签: java macos swing fonts jtable

随着年龄的增长,我越来越多地在OSX中使用 Ctrl - + 来增加各种窗口(浏览器,编辑器等)的字体大小。但是,在自定义应用中的JTable上,它当然不起作用。

如何将此功能添加到我自己的Swing JTable

我希望增加/减少JTable中已有的任何字体,并适当调整列宽。

我有一个大致的想法如何编码(添加热键,获取当前字体,增加大小,设置新字体,无效),但不知道如何将它应用于我已有的许多表。也不是如何正确调整列宽。

我应该创建一个新的基类还是添加某种插件?其他想法?

1 个答案:

答案 0 :(得分:0)

这个解决方案有点粗糙,但它演示了如何使用 ctrl + ctrl - 实现放大和缩小:

public class FontTable extends JPanel {

    JTable table;

    FontTable() {

        Object[][] data = {{"aaa", "122", "_____"}, {",,,,,", ",,,", ",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"}};
        Object[] names = {"C1", "C2", "C3"};
        table = new JTable(data, names);

        InputMap im = table.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
        im.put(KeyStroke.getKeyStroke('=', InputEvent.CTRL_DOWN_MASK), "zoom in");
        im.put(KeyStroke.getKeyStroke('-', InputEvent.CTRL_DOWN_MASK), "zoom out");
        table.getActionMap().put("zoom in", new ZoomAction(true));
        table.getActionMap().put("zoom out", new ZoomAction(false));

        setLayout(new BorderLayout());
        add(new JScrollPane(table));
    }

    class ZoomAction extends AbstractAction {

        boolean in;

        ZoomAction(boolean in) {

            this.in = in;
        }

        @Override
        public void actionPerformed(ActionEvent e) {

            Font oldFont = table.getFont();
            float size = oldFont.getSize() + (in ? +2 : -2);
            table.setFont(oldFont.deriveFont(size));

            for (int row = 0; row < table.getRowCount(); row++) {
                int rowHeight = table.getRowHeight(row);

                for (int col = 0; col < table.getColumnCount(); col++) {
                    Component comp = table.prepareRenderer(table.getCellRenderer(row, col), row, col);
                    TableColumn column = table.getColumnModel().getColumn(col);
                    int colWidth = column.getWidth();

                    rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
                    colWidth = comp.getPreferredSize().width;

                    column.setPreferredWidth(colWidth);
                }
                table.setRowHeight(row, rowHeight);
            }
        }
    }
}

我使用Camick's answer作为参考。把它放在一些框架中进行测试。

至于向后实现它,您可以子类JTable并添加此新功能,然后用新类替换现有的功能,或者在接口中使用嵌套类执行更棘手的操作并实现该接口。