• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:drawStringで文字間隔の調整)

drawStringで文字間隔の調整方法はありますか?

このQ&Aのポイント
  • Graphics.drawString()を使用して文字を描画するときに、文字間隔を設定したいと思っています。しかし、FontMetricsやgetWidths()メソッドを使っても正確な文字間隔を設定することはできず、この問題を解決する方法を知りたいです。
  • 現在、drawString()メソッドを使用して文字を描画していますが、文字間隔を設定できないことに悩んでいます。FontMetricsやgetWidths()メソッドを試してみましたが、正確な文字間隔が設定できず、望んだ精度で文字を描画することができません。
  • 文字間隔を調整するためには、drawString()メソッドでの文字幅の取得が必要ですが、現在の方法では正確な文字幅が取得できません。この問題を解決するために、文字間隔を設定する方法を知りたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.1

 こんばんは。  スマートなやり方なのかどうかわからないのですが、一文字づつdrawStringしていくのはどうでしょう?  たとえば、こんな↓メソッドを用意して、paintメソッドやpaintComponentメソッドから呼んだらどうでしょう? public static void drawIntervalString(Graphics g, String string, int x, int y, int interval) {   if (interval > 0) {     FontMetrics metrics = g.getFontMetrics();     for (int i = 0; i < string.length(); i++) {       char moji = string.charAt(i);       g.drawString(Character.toString(moji), x, y);       x = x + metrics.charWidth(moji) + interval;     }   }   else {     g.drawString(string, x, y);   } }  また、より細かくしたい場合は、Graphics2Dを使うようにこういう風に↓することもできると思います。 public static void drawIntervalString(Graphics2D g, String string, float x, float y, float interval) {   if (interval > 0) {     FontMetrics metrics = g.getFontMetrics();     for (int i = 0; i < string.length(); i++) {       char moji = string.charAt(i);       g.drawString(Character.toString(moji), x, y);       x = x + metrics.charWidth(moji) + interval;     }   }   else {     g.drawString(string, x, y);   } }

masa_tarou
質問者

お礼

Graphics2Dのdrawstringを見落としていたみたです。 float型での描画のメソッドが準備してあったのですね。 サンプルソースまでつけていただいて、本当にありがとうございます。 無事、目的の精度で描画することができました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。

    GDI+のDrawStringを使って文字を滑らかに描画したいのですが。。。 環境は、VC++のWin32プロジェクトです。 WindowのデバイスコンテキストからGraphicsオブジェクトを生成し、DrawStringとすると滑らかに描画されます。 しかし、BitmapオブジェクトからGraphicsオブジェクトを生成し、DrawStringを行うとビットマップフォントのようです。 Graphics g(hdc); g.DrawString(......); -> この場合はなめらか(画像の下の方) しかし、 Bitmap bmp(w, h, PixelFormat32bppARGB); Graphics g (&bmp); g.SetSmootingMode(SmoothingModeHighQuality); g.DrawString(...); -> ジャギが目立つ。(画像の上の方) ビットマップ(メモリ)にスムーズなテキストを描画することはできないのでしょうか? ちなみにフォントはメイリオです。

  • drawStringの座標について

    paintメソッド内で、drawStringで文字列を、 drawImageで画像をそれぞれ表示しています。 drawStringとdrawImageの両方で、同じ座標を 指定しても表示位置がずれます。x座標は ぴったり一致するのですがy座標が7から8ポイント ほどずれます。この二つのメソッドによる座標 と表示位置を一致させたいのですが、よい方法は ありませんでしょうか。どうぞよろしくお願い いたします。 public void paint(Graphics g) { g.drawImage(image,20,20,100,20); Font fnt=new Font("HGゴシックM",Font.PLAIN,12); g.setFont(fnt); g.drawString("Hello",20,20);//座標値はおなじで               も表示位置がずれる }

    • ベストアンサー
    • Java
  • Javaで左上の位置を指定して文字を描画する方法を探しています。

    Javaで左上の位置を指定して文字を描画する方法を探しています。 JavaでGraphicsオブジェクトを使用して文字を描画する際に、Javaの標準の方法(java.awt.graphicsのdrawStringメソッド)を使う場合では「ベースラインの位置」を指定しますが、これを「左上端の座標」を指定して描画できるようにするにはどうしたらよいのでしょうか。

    • ベストアンサー
    • Java
  • 文字を縦書きで描画する

    drawStringメソッドを使用すると、横書きで 引数の文字列を描画しますが、これを縦書きで描画したい 場合はどのようにすればよろしいのでしょうか?

    • ベストアンサー
    • Java
  • アプレットで文字列の描画を横を半分に縮小して描画したい。

    java初心者です。 アプレットで文字列を描画するときにdrawStringメソッドで描画すると思うのですが、それでデフォルトで描画する時の横の長さを半分にして描画したいのですが(見た目的には縦長にする感じです)、何か方法はあるでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • vbaで、オートシェイプ文字幅と間隔について

    動作環境 OS:Windows7(64Bit) Home Premium SP1 MS:Office Version2007 SP3 Excel図形内のテキスト編集で、マウスをドラッグしてテキストの領域を選択後、コンテキスト メニューから、フォント(F)-フォント(設定ダイアログ)画面-[文字幅と間隔]タブ上に、間隔と幅が、 あります(画像参照)。 テキスト設定した場合、vba上から文字間隔と幅を取得する方法が、知りたいです。 それと、カーニングもついでに、取得する方法が、知りたいです。 大体、目途は、付いています。 どなたか、ご指導願います。 ■現在、自分が、分かっている文字間隔と幅を取得するPG(URL参照) http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1188387871 下記の方法ですと、MsgBoxで、[文字間隔を広げる]設定値が取得されます。 For Each wkbWorksheets In ActiveWorkbook.Worksheets For Each wksShapes In wkbWorksheets.Shapes With wksShapes.TextFrame2.TextRange.Characters MsgBox .Font.Spacing End With Next wksShapes Next wkbWorksheets ※[標準]、[文字間隔をつめる]、[カーニング]で、vbaから設定値を取得するには?

  • photoshop CS3で文字を横に、等間隔に並べたい!のですが、ど

    photoshop CS3で文字を横に、等間隔に並べたい!のですが、どうしたらいいのでしょうか。 自分でカーニングなど設定してみたものの、フォントを変えると、また間隔が変わって困り果てています。 どんな文字でも、1文字当たり、~ピクセルの幅、といった様な設定はできますか?私は、macとphotoshopしか持っていません。宜しくお願いします。

    • 締切済み
    • Mac
  • iアプリ、それともJava(?)における文字表示の挙動について

    iアプリ、それともJava(?)における文字表示の挙動について public void run(){  Graphics g = getGraphics();  while(true){   g.lock();   int i = 1;   g.drawString("hogehoge",0,15 + i); //下にずれて表示されていく。   g.unlock(true);   i++;  }//while() }//run() 【質問】 whileループで繰り返し、上記のような処理がなされる場合、 一度表示した文字は残らず、ループの繰り返し毎に、 何も表示されていない所に、1から表示しなおされる形で、 処理が行われています。 例えば、ループなしの簡単なHellow World!のような文字表示サンプルプログラムですと、 そのHellow World!という文字列を1度描画したら、そのまま描画されたままですが、 whileループの場合、 ループごとに、真っ白な状態に初期化され、その上に次の描画が行われ…ということを、 繰り返しているようです。 この時の、「毎回のループの初めに行われているであろう、真っ白な状態への初期化」は、 どういった仕組みで行われているのでしょうか? 別の言い方で言うと、 「whileループの描画処理が、蓄積されていかないのは何故?また、その蓄積がなされない理由(しくみ)はどこに?」 となります。 上記whileループの挙動に対し、 文字と文字が重なっていく、とか、 上段から下段へと文字がどんどん蓄積されながら描画されていく、 なんてことを想定していたわけですが、 実際には、そうはならないため、質問をさせて頂きました。、 このあたりのことについて、どなたか、お分かりになる方、ご教示下さい。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • C#でピクチャーボックスへの文字列描画について

    C#でピクチャーボックスへの文字列描画について DOBON.NETからコピペです //PictureBox1のGraphicsオブジェクトを取得 Graphics g = PictureBox1.CreateGraphics(); string drawString= @"智に働けば角が立つ。情に棹させば流される。 意地を通せば窮屈だ。とかくに人の世は住みにくい。"; //Fontを作成 Font fnt = new Font("MS ゴシック", 12); //文字列を表示する範囲を指定する RectangleF rect = new RectangleF(10, 10, 100, 200); //rectの四角を描く g.FillRectangle(Brushes.White, rect); //文字を書く g.DrawString(drawString, fnt, Brushes.Black, rect); //リソースを開放する fnt.Dispose(); g.Dispose(); 自分で使ってるピクチャーボックスは動的生成してるので picbox[i] という感じになってます この場合 初めの宣言の時は picbox = new System.Windows.Forms.PictureBox[pic_cnt]; for (i = 0; i < n) { picbox[i] = new System.Windows.Forms.PictureBox(); Graphics g = picbox[i].CreateGraphics(); <中略> } で大丈夫なのでしょうか? 文字列は描画されないし、エラーもでないので どこが間違っているのかわかりません… 説明不足のところがあれば書いてください あと、修復場所を指摘してくださればありがたいです

  • シンボルが解決できません

    import java.applet.*; import java.awt.*; public class keiin extends Applet implements Runnable { int narabi[]=new int[10]; public void init(){ } public void start() { } public void paint(Graphics g) { for (int i=0; i==kun+1; i++) { g.drawString(narabi[i],i*30,30); } } public void run() { repaint(); num++; } } public void update(Graphics g) { paint(g); } } というプログラムを作っていて、javacでコンパイルすると、 「C:\Documents and Settings\Administrator\My Documents\ycworks\java\keirin\0.01\keiin.java:49:シンボルを解決できません。 シンボル:メソッド drawstring(int,int,int) 場所:java.awt.Graphicsのクラス g.drawString(narabi[i],i*30,30); ^ と出て、コンパイルされません。 Javacのある場所を環境変数に登録してコンパイルしてみたり、配列変数がおかしいのかと思い、narabi[i]を文字列(g.drawstring("hoge",50,30);)にしたり、試してみたのですが、効果なしです。 解決方法を教えてください