当前位置: 首页 > 知识库问答 >
问题:

Java 7-图形2D。setFont()和Graphics2D。打印时,setColor()被默认值覆盖。

有权
2023-03-14

特定区域的代码在我的Visualise2D. class中画布和打印的渲染器是相同的,它们都称为Visualise2D. class。

Visualise2D中的一些代码

    public void paintSurfaceTimes(Graphics2D gTimes, SurfaceConnector s, Dummy d, Color c, Rectangle2D bounds,double scale, double enhanceTie, double enhance ){
    gTimes.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

    FontMetrics fm = gTimes.getFontMetrics();
    double hEdge = (UnitConvert.pixelsToMeters(LiteTieTRIAL.averageSize));
    double x1 =((d.getEasting() - bounds.getX()));
    double y1 = (bounds.getHeight() + bounds.getY() - d.getNorthing());

    if (d instanceof Hole) {
        hEdge = (UnitConvert.pixelsToMeters(((Hole) d).getDiameter()* enhance)/2);
    }
    else
        hEdge = (UnitConvert.pixelsToMeters(LiteTieTRIAL.averageSize * enhance)/2);

    x1 =((d.getEasting() - bounds.getX()));
    y1 = (bounds.getHeight() + bounds.getY() - d.getNorthing());

    gTimes.setColor(c);
    gTimes.setFont(DEFAULT_FONT);
    fm = gTimes.getFontMetrics();
    gTimes.drawString((dec0P.format(s.getTime())), 
            (int)((x1+hEdge*Math.cos(180))*scale - fm.getStringBounds(dec0P.format(s.getTime()), gTimes).getWidth()),
            (int)((y1 - hEdge*Math.sin(0))*scale+ fm.getStringBounds(dec0P.format(s.getTime()), gTimes).getHeight()));
}

在我的getCanvas()方法中,还有一些来自画组件(图形g)的代码

                    //Draws SurfaceTimes
                if(surfaceTimesOnOffButton.isSelected())    {
                    try {
                        getSurfaceTimes();
                    } catch (NegativeNumberException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    for(Pattern tempPat: world.getPatternList().values()){
                        for(SurfaceConnector sc: tempPat.getSurfaceList().values()){
                            //                          boolean isSelected = sc == selected || (selected instanceof Collection<?> && ((Collection<?>)selected).contains(sc));   

                            if(sc.getTo() instanceof Dummy ){
                                renderer.paintSurfaceTimes(g2, sc, sc.getTo(), colourTimes, bounds, Zoom.getScalingFactor()* UnitConvert.metersToPixels(1), enhanceTie, enhance);
                            }

                        }
                    }
                }

画布绘图代码和可打印代码之间的唯一区别是:下面的getCanvas()代码...

Visualise2D renderer = new Visualise2D();
            @Override public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D) g;

LiteTiePrinter.class

public class LiteTiePrinter implements Printable {

public int print(Graphics g,PageFormat pf,int page)引发PrinterException{

// We have only one page, and 'page'
// is zero-based
if (page > 0) {
     return NO_SUCH_PAGE;
}

Graphics2D g2d = (Graphics2D)g;

g2d.translate(pf.getImageableX(), pf.getImageableY());

// Now we perform our rendering
Visualise2D renderer = new Visualise2D();

感谢任何帮助,为什么字体输出不同。提前谢谢你。

共有1个答案

史良哲
2023-03-14

大家好,阅读本文的人。我想我会分享我15个小时的互联网搜索和堆栈溢出,以找到我自己的问题的答案。我刚刚找到了一个,并测试了一个建议。它成功了。

我选择使用用户456837提供的答案。如果我有足够的分数,我会投票给这个用户。

答案是用drawGlyphVector()补充drawString()。成功了!

//GET THE FONTMETRICS
        FontMetrics fm = h2.getFontMetrics();
        //GET THE DIAMETER OF THE HOLE
        double hEdge = (UnitConvert.pixelsToMeters(hole.getDiameter()));
        // GET THE LOCATION OF THE HOLE
        double x1 =((hole.getEasting() - bounds.getX()));
        double y1 = (bounds.getHeight() + bounds.getY() - hole.getNorthing());
        //SET THE COLOUR OF THE TEXT
        h2.setColor(AMETHYST);
        //SET THE FONT TO USE
        h2.setFont(new Font("Monaco", Font.BOLD, 8));
        //USING - DRAWGLYPHVECTOR() TO OVERCOME THE PRINTING ISSUE RELATED TO THE OSX PORT OF JAVA7 - MAY NOT NEED THIS WITH FUTURE UPDATES.
        h2.drawGlyphVector(
                h2.getFont().createGlyphVector(h2.getFontRenderContext(), 
                dec1P.format(hole.getHoleLength())),
                (int)((x1+hEdge*Math.cos(300))*scale)- (fm.stringWidth(dec1P.format(hole.getHoleLength()))/2),  
                (int)((y1 + (hEdge *enhance*1.1)/2)*scale) +(fm.getHeight()/2) +pixelOffset
                );
        
        /*//USING - DRAWSTRING() DOESN'T WORK IN JAVA 7 ON MAC OSX
        h2.drawString(
                (dec1P.format(hole.getHoleLength())),   
                (int)((x1+hEdge*Math.cos(300))*scale)- (fm.stringWidth(dec1P.format(hole.getHoleLength()))/2),  
                (int)((y1 + (hEdge *enhance*1.1)/2)*scale) +(fm.getHeight()/2) +pixelOffset
                );
*/

我希望这能帮助任何搜索相同问题的人。此外,我建议你阅读斯蒂芬·格雷尼尔关于这个问题的博客。它在一篇博客评论中提到,这在Java7u40中并不明显...所以也许我最好升级...?

请阅读下面的链接

osx上的打印问题

 类似资料:
  • 有没有一种方法我可以在Java中操纵一个PrinterJob而不是实际打印到打印机上,这样我就可以获得每一页的图形对象?我尝试将PrintService设置为null,但Java不允许这样做。 这样,我就可以检索文档的准确打印预览,而不必在不同的上下文中从头重新构建PrinterJobs函数。 下面是我的程序中打印函数的代码: 你已经可以看到图形对象被记录了,这样我就可以在另一个组件中绘制它们了,

  • 你能直接在一台已连接到你的计算机上的打印机上打印一个MATLAB图形,或输出图形到一种MATLAB所支持的图象文件格式。这里提供两种打印或输出图形的方法。 在File菜单下用Print选项 用print命令 从菜单打印 在File菜单下方有四个菜单选择是关于打印的。 Page Setup选项显示一个对话框, 它使你能调整打印页图形的特征。 Print Setup选项显示一个对话框,它设置打印默认值

  • 我试图覆盖Archaius为线程池提供的默认配置(如corepool大小、最大池大小、队列大小等)。但不知何故,它并没有起到作用。下面是我在application.yml文件中的配置。 Hystrix:命令:QueryTimeOutHandler:执行:隔离:线程:TimeOutInMilliseconds:600000线程池:QueryTimeOutHandler:CoreSize:200 Ma

  • 我创建了一个带有整数类型键的映射,值是字符串集。我已经用一些测试数据填充了映射,现在需要编写一个方法来打印映射的内容,例如“key: value, value, value” 我假设迭代映射,并将键分配给int变量并打印出来是如何开始的,但是我该如何打印字符串集中的值呢?

  • 我有一个bean,它使用@value注释填充属性,如下所示 在我的应用程序上下文中,我有以下配置 当values.properties文件不存在时,默认值“none”会按预期设置,但是当属性文件存在时,默认值仍会使用,即使我收到一条日志消息,说明属性文件是从PropertyPlaceholderConfigurer加载的 只有当属性文件丢失和/或占位符不可解析时,我才需要默认值生效;不是一直都是。