2017-06-26 54 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