2017-06-26 56 views
1

加标和字体为String我想提请对我的JFrame有标和字体的字符串,我试图用构造一个AttributedString但我似乎并不想为工作无论原因。它要么一次只显示字体或只是标而不是两个。图形JFrame上

private class DrawFormulas extends JComponent 
{ 
    public void paint(Graphics g) 
    { 

     Graphics2D G2D = (Graphics2D)g; 

     G2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

     g.setFont(F); 

     AttributedString Trig = new AttributedString("a2 + b2 = c2"); 
     Trig.addAttribute(TextAttribute.FONT, F); 
     Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 1, 2); 
     Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 6, 7); 
     Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 11, 12); 
     Trig.addAttribute(TextAttribute.SIZE, F.getSize()); 
     G2D.drawString(Trig.getIterator(), 170, 75); 

    } 
} 

如果有人能告诉我为什么这不工作或有这样做的任何帮助的一个更好的办法,将不胜感激。谢谢

+0

哪个是你的字体? – Frakcool

+0

它是在方法外定义的F Font F = new Font(“SANS_SERIF”,Font.PLAIN,60); – LoganMacMonkey

+0

1+为一个很好的代码片段,但是请确保下次发布有效的[mcve],因此我们不需要问什么字体(或代码中的任何数据)。我的回答显示了一个MCVE的例子 – Frakcool

回答

1

我不知道为什么当同时使用TextAttribute.FONTTextAttribute.SUPERSCRIPT不会合并这些属性,但@thrashgod的answer为您的解决方案提供了想法。

分离Font对象分为:

  • 字体大小= 60
  • 字体家族= Font.SANS_SERIF
  • 字体风格= Font.PLAIN

由于风格是纯我们只需要字体大小

:和字体系列,所以我是这样结束10
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.font.TextAttribute; 
import java.text.AttributedString; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class FormulaDrawer { 
    private JFrame frame; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new FormulaDrawer()::createAndShowGui); 
    } 

    private void createAndShowGui() { 
     frame = new JFrame(getClass().getSimpleName()); 

     Drawer drawer = new Drawer(); 

     frame.add(drawer); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    @SuppressWarnings("serial") 
    class Drawer extends JPanel { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2d = (Graphics2D) g; 
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 

      AttributedString trig = new AttributedString("a2 + b2 = c2"); 
      trig.addAttribute(TextAttribute.FAMILY, "Comic Sans MS"); //Change to Font.SANS_SERIF constant 
      trig.addAttribute(TextAttribute.SIZE, 20); 

      trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 1, 2); 
      trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 6, 7); 
      trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 11, 12); 

      g2d.drawString(trig.getIterator(), 50, 50); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(200, 200); 
     } 
    } 
} 

然而,你可能已经注意到我用20而不是60的字体大小,以及那是因为它似乎对我来说太大,只是改变它,你就大功告成了,也是我用另一种字体,这样你就可以看到你可以使用你想要的任何字体(只要确保已经安装了该字体或将它导出到你的JAR文件中)

一般的想法是分别使用字体属性,如上面的代码所示在这些行中:

trig.addAttribute(TextAttribute.FAMILY, "Comic Sans MS"); 
trig.addAttribute(TextAttribute.SIZE, 20); 

,这是它的样子:)

enter image description here


而且一定要遵循Java naming conventions让你的代码变得更容易为您和我们阅读:

  • firstWordLowerCaseVariable
  • firstWordLowerCaseMethod(...)
  • FirstWordUpperCaseClass
  • ALL_WORDS_UPPER_CASE_CONSTANT

另一个改进你的代码是:尽量不要扩大和压倒一切的JComponentpaint()方法分别为,而不是延长JPanel或任何其他组件,并覆盖它的paintComponent(Graphics g)方法,一定要调用super.paintComponent(g)作为第一行里面,这样你就不会打破油漆链。

main(...)方法可能看起来奇怪,你也因为在Java 8中的Method ReferenceEvent Dispatch Thread (EDT),你应该始终开始你的挥杆程序。


是有办法,我可以做到这一点的字体的风格?

是的,有(如链接被证明thrashgod的答案)

你可以找到更多的样式阅读TextAttribute文档

例如:

trig.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); 
trig.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE); 
+0

非常感谢,它效果很好。还有一个问题,你。我可以通过F.getSize()设置大小,我可以通过F.getFamily()设置家族,但是有没有办法通过字体样式来实现?我很确定你用TextAttribute.WEIGHT设置它,但我不知道如何将它从字体中拉出来。 – LoganMacMonkey

+0

@LoganMacMonkey查看我的最后编辑 – Frakcool

+0

谢谢你的帮助,这是非常有帮助:) – LoganMacMonkey