栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

MessageFormat标头/ footerFormat如何更改JTable打印的字体

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MessageFormat标头/ footerFormat如何更改JTable打印的字体

正如每个人都已经提到的那样(当我在假期放松时:-)-TablePrintable紧密结合以确保机密性,无法继承任何类,也无法配置页眉/页脚打印。挂钩的唯一选择是包装表的默认可打印内容,让它在没有页眉/页脚的情况下进行工作,并自行打印页眉/页脚。

到目前为止显示的代码片段的问题在于,它们不能很好地与多页一起使用-当然,这是所有作者都知道和提到的-
因为默认可打印内容认为没有页眉/页脚,并且可以自由使用它们所需的空间。不出所料 :-)

所以问题是:有没有办法使默认值不打印到页眉/页脚区域?是的,它是:double-wopper(ehh .. wrapper)是答案-
通过将给定的pageFormat封装为一个返回调整后的getImageableHeight /
Y的值,使默认printable相信其可打印空间更少。就像是:

public class CustomPageFormat extends PageFormat {    private PageFormat delegate;    private double headerHeight;    private double footerHeight;    public CustomPageFormat(PageFormat format, double headerHeight, double footerHeight) {        this.delegate = format;        this.headerHeight = headerHeight;        this.footerHeight = footerHeight;    }        @Override    public double getImageableY() {        return delegate.getImageableY() + headerHeight;    }        @Override    public double getImageableHeight() {        return delegate.getImageableHeight() - headerHeight - footerHeight;    }    // all other methods simply delegate

然后在可打印包装纸中使用(必须同样完成页脚):

public class CustomTablePrintable implements Printable {    Printable tablePrintable;    JTable table;    MessageFormat header;     MessageFormat footer;    public CustomTablePrintable(MessageFormat header, MessageFormat footer) {        this.header = header;        this.footer = footer;    }    public void setTablePrintable(JTable table, Printable printable) {        tablePrintable = printable;     this.table = table;    }    @Override    public int print(Graphics graphics, PageFormat pageFormat,  int pageIndex) throws PrinterException {        // grab an untainted graphics        Graphics2D g2d = (Graphics2D)graphics.create();        // calculate the offsets and wrap the pageFormat        double headerOffset = calculateHeaderHeight(g2d, pageIndex);        CustomPageFormat wrappingPageFormat = new CustomPageFormat(pageFormat, headerOffset, 0);        // feed the wrapped pageFormat into the default printable        int exists = tablePrintable.print(graphics, wrappingPageFormat, pageIndex);        if (exists != PAGE_EXISTS) { g2d.dispose(); return exists;        }        // translate the graphics to the start of the original pageFormat and draw header        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());        printHeader(g2d, pageIndex, (int) pageFormat.getImageableWidth());        g2d.dispose();        return PAGE_EXISTS; }    protected double calculateHeaderHeight(Graphics2D g, int pageIndex) {        if (header == null) return 0;        Object[] pageNumber = new Object[]{new Integer(pageIndex + 1)};        String text = header.format(pageNumber);        Font headerFont = table.getFont().deriveFont(Font.BOLD, 18f);        g.setFont(headerFont);        Rectangle2D rect = g.getFontMetrics().getStringBounds(text, g);        return rect.getHeight();    }    protected void printHeader(Graphics2D g, int pageIndex, int imgWidth) {        Object[] pageNumber = new Object[]{new Integer(pageIndex + 1)};        String text = header.format(pageNumber);        Font headerFont = table.getFont().deriveFont(Font.BOLD, 18f);        g.setFont(headerFont);        Rectangle2D rect = g.getFontMetrics().getStringBounds(text, g);        // following is c&p from TablePrintable printText        int tx;        // if the text is small enough to fit, center it        if (rect.getWidth() < imgWidth) { tx = (int) ((imgWidth - rect.getWidth()) / 2); // otherwise, if the table is LTR, ensure the left side of // the text shows; the right can be clipped        } else if (table.getComponentOrientation().isLeftToRight()) { tx = 0; // otherwise, ensure the right side of the text shows        } else { tx = -(int) (Math.ceil(rect.getWidth()) - imgWidth);        }        int ty = (int) Math.ceil(Math.abs(rect.getY()));        g.setColor(Color.BLACK);        g.drawString(text, tx, ty);    }}

最后从表的getPrintable返回,如:

    final JTable table = new JTable(myModel){                @Override        public Printable getPrintable(PrintMode printMode,     MessageFormat headerFormat, MessageFormat footerFormat) { Printable printable = super.getPrintable(printMode, null, null); CustomTablePrintable custom = new CustomTablePrintable(headerFormat, footerFormat); custom.setTablePrintable(this, printable); return custom;        }    };

可以实现printHeader / Footer来执行所需的任何操作。

归根结底:“我是否需要调用g.drawString(…)”这个问题的答案仍然是“是”。但是至少它安全地位于表本身之外:-)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/595420.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号