2017-06-26 12 views
1

私は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です フォントF =新しいフォント( "SANS_SERIF"、Font.PLAIN、60); – LoganMacMonkey

+0

1+素敵なスニペットの場合は、次に有効な[mcve]を投稿するときに、フォント(またはコード内のデータ)が何であるかを尋ねる必要はありません。私の答えはその例を示していますMCVE – Frakcool

答えて

1

TextAttribute.FONTTextAttribute.SUPERSCRIPTの両方を使用してこれらの属性をマージしない理由はわかりませんが、@ thrashgodのanswerはあなたの解決策を示しました。

セパレート

Fontオブジェクトに:

  • フォントサイズ= 60
  • フォントファミリー= Font.PLAIN

= Font.SANS_SERIF

  • フォントスタイルスタイルは無地であるので、我々は唯一のフォントサイズを必要としますフォントファミリを使用しているので、次のようになりました。

    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); 
         } 
        } 
    } 
    

    しかし、私は60の代わりに20のフォントサイズを使用していたことに気がつくかもしれません。それは私には大きすぎると思われ、変更して完了しました。別のフォントを使用しました。

    一般的な考え方は、上のコードのように、上記のコードのように個別にフォント属性を使用することでした:

    (英語の場合は、このフォントを使用してください)
    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

    あなたのコードに別の改良である:代わりにJPanelまたはその他のコンポーネントを拡張し、それがpaintComponent(Graphics g)方法だオーバーライドし、それぞれJComponentpaint()方法を拡張し、オーバーライドしないようにしようと、あなたがいないので、その中の最初の行としてsuper.paintComponent(g)を呼び出してくださいペイントチェーンを破る。

    main(...)方法があるため、あなたが常にあなたのスイングプログラムを起動する必要がありのJava 8でMethod ReferenceEvent Dispatch Thread (EDT)のもあなたには奇妙に見えるかもしれません。


    私は、フォントのスタイルでそれを行うことができる方法はありますか?

    (thrashgodの答えへのリンクに示されたように)はい、あり

    であるTextAttribute.WEIGHT

  • でありますTextAttribute文書

    を読むともっと多くのスタイルが見つかります例えば

    :あなたのフォントです

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

    ありがとう、それは素晴らしい仕事をしました。あなたにもう1つの質問があります。私はF.getSize()を通してサイズを設定できました。私はF.getFamily()を通してファミリを設定できますが、フォントのスタイルでそれを行う方法はありますか?私はあなたがTextAttribute.WEIGHTでそれを設定しているとはかなり確信していますが、フォントからそれをどのように取り出すのか分かりません。 – LoganMacMonkey

    +0

    @LoganMacMonkey最後の編集を参照 – Frakcool

    +0

    助けてくれてありがとう、とても助かりました:) – LoganMacMonkey

    関連する問題