Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 >  掲示板 >  掲示板(初心者 文字表示の改行をしたいのですがやりかたがわかりません)
閲覧数:1227
掲示板(初心者 文字表示の改行をしたいのですがやりかたがわかりません)
名前
匿名
題名 初心者 文字表示の改行をしたいのですがやりかたがわかりません
質問内容

質問を評価する
(0ポイント)
前回質問させていただいたゲームを作っている初心者で
す。
前回質問http://www.javaroad.jp/bbs/answer.jsp?
q_id=20130215033120249

画像の表示に成功したのでメッセージレイヤの制作にと
りかかったのですが、文字の改行がうまくいきません。
ゲーム用なので1文字づつの表示にすることはうまくい
くのですが、改行がうまくいきません。
以下にコードを記します。
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;


public class message extends Layer{
    
    
    BufferedImage image;        //画像
    int messegeSpeed=100;        //メッセー
ジスピード(ミリ秒)
    int minspeed=1000;            //
最遅メッセージスピード
    int messageSize=30;            //
フォントのサイズ
    int messnum;                //
現在表示しているメッセージ
    Timer t;
    Font f = new Font(null, 1,messageSize );//
使用するフォント
    String message="おはようございます。テスト
ちゅう。テストといえば高校時代のテストもっと頑張っ
とけばよかったな";
    int x=0,y=0;                //
表示サイズ
    int lx=0,ly=30;                //
表示場所
    int originalX,originalY;    //画像のオ
リジナルサイズ
    int startX,startY;            //
元画像の一部を表示したい時に使用
    
    message(){            //コンスト
ラクタ
        setVisible(true);
        setFont(f);
        t=new Timer();
        t.schedule(new 
Message(),0,messegeSpeed);        
//messegeSpeedミリ秒経つ度にTimerTaskであるMessage
を呼び出し
    }
    public void p(String imgpath,int lX,int 
lY,int X,int Y){    //画像の読み込み、および表

        image=Imagedraw(imgpath,lX,lY,X, 
Y);    //画像を表示してイメージをimageに入れる。
    }
    
    public void p(String imgpath,int lX,int 
lY){        //画像の読み込み、および表示。サイ
ズ指定なし。
        image=Imagedraw(imgpath,lX,lY);    //
画像を表示してイメージをimageに入れる。
        x=originalX=image.getWidth();
        y=originalY=image.getHeight();        
    }
    
    public void p(String imgpath){        //
画像の読み込み、および表示。サイズ、表示場所指定な
し。
        image=Imagedraw(imgpath);    //
画像を表示してイメージをimageに入れる。
        x=originalX=image.getWidth();
        y=originalY=image.getHeight();
    }
    
    
    
    void write(){//メッセージがある限り次のメ
ッセージを指定
        
if(messnum<message.toCharArray().length){
            messnum=messnum+1;
            repaint();
        }else{}
    }
        
    public void paint(Graphics g){                
//イメージとメッセージを描画
        
        
g.drawImage(image,0,0,x,y,startX,startY,x+startX,y
+startY,this);
        
        
            
g.drawChars(message.toCharArray(),0, messnum, lx, 
ly);
        
        
        
        
    }

    class Message extends TimerTask{        
//messegeSpeedミリ秒経つ度に呼び出される。

      public void run()
      {
      
          write();
      }

     }    

        
}


どなたか御教授お願いいたします。
質問日時 2013-02-21 09:23:18
名前
匿名
回答内容

回答を評価する
(0ポイント)
質問者です。
また、前回のコードも改造しましたので合わせて拝見く
だされば幸いです。

ゲームフレーム


import java.awt.Dimension;
import javax.swing.*;


public class gameFrame extends JFrame{
        
    int x,y;        //表示サイズ
    int lx=0,ly=0;    //表示場所
    Layer[] Layer;    //レイヤ
    messageWindow mw;
    message ml;
    JLayeredPane Lc =new JLayeredPane();

    
                                
//コントラスタ
    gameFrame(String name,int X,int Y,int 
lX,int lY){
        
        super(name);
        
        x=X;y=Y;lx=lX;ly=lY;
        
        try{            
            
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
); 
            this.pack();
            this.setLocation(lx,ly);
            this.setSize( new 
Dimension(x, y));
            this.setVisible(true);
        }catch(Exception e){
            e.printStackTrace();
        }
        Lc.setLayout(null);
        setContentPane(Lc);
        obj(3);
                    
    }    
    gameFrame(String name,int X,int Y){
        
        super(name);
        
        x=X;y=Y;
        
        try{            
            
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
); 
            this.pack();            
            this.setSize( new 
Dimension(x, y));
            this.setVisible(true);
        }catch(Exception e){
            e.printStackTrace();
        }
         Lc.setLayout(null);
         setContentPane(Lc);
        obj(10);
                    
    }    
    gameFrame(String name){
        
        super(name);
        x=690;y=490;
        try{            
            
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE
); 
            this.pack();            
            this.setSize( new 
Dimension( x,y));
            this.setVisible(true);
        }catch(Exception e){
            e.printStackTrace();
        }
         Lc.setLayout(null);
         setContentPane(Lc);
        obj(10);
                    
    }
        
                                
//オブジェクト生成
    
    public void obj(int Layernum){
        Layer=new Layer[Layernum+1];
        
        Layer[0]=new Layer();        
         
this.getContentPane().add(Layer[0] ) ;
         
Lc.setLayer(Layer[0],Lc.DEFAULT_LAYER  );
        
        for(int i = 1; i < Layernum; i++){
            if(Layer[i]!=null){}
            else{
                Layer[i]=new 
Layer();
                
this.getContentPane().add(Layer[i]);
                
Lc.setLayer(Layer[i],Lc.DRAG_LAYER ,i);
            }
            
        }
        
        
    }
    
                                
//エラーウィンドウ(未
    
    public void mw(){
        mw=new messageWindow(this);
    }
    
                                
//レイヤ
    
     void ip(int Layernum,String img ,int 
lX,int lY,int X,int Y){        //イメージペイント
            if(img==null){
                
System.out.println("Layer["+Layernum+"]のimgはnull
です");
            }
            
Layer[Layernum].p(img,lX,lY,X,Y);
    }
    void ip(int Layernum,String img ,int 
lX,int lY){
        if(img==null){
                
System.out.println("Layer["+Layernum+"]のimgはnull
です");
            }
            
Layer[Layernum].p(img,lX,lY);
    }
    void ip(int Layernum,String imgorcolor ){
        if(imgorcolor==null){
                
System.out.println("Layer["+Layernum+"]のimgはnull
です");
        }
            
Layer[Layernum].p(imgorcolor);
    }
    void ic(int Layernum,int position){
        if(Layernum==0)
{System.out.println("Layer[0]は背景レイヤのため移
動できません");}
        else{            
            
Lc.setLayer(Layer[Layernum],position);
        }
    }
    
                                
//メッセージレイヤ
    
    public void newMessage(){
    
        ml = new message();
        this.getContentPane().add(ml);
        Lc.setLayer(ml,Lc.MODAL_LAYER   
,1);
        ml.p("mess.png");        
        ml.setLocation((20)/2,y-230+10);
    }
    
}


レイヤ

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class Layer extends JPanel {
    
    BufferedImage image;
    int x=0,y=0;        //表示サイズ
    int lx=0,ly=0;    //表示場所
    int originalX,originalY;
    int startX,startY;

    
    Layer(){
        
    }
    
    public void p(String imgpath,int lX,int 
lY,int X,int Y){
        image=Imagedraw(imgpath,lX,lY,X, 
Y);
    }
    public void p(String imgpath,int lX,int 
lY){
        image=Imagedraw(imgpath,lX,lY);
    }
    public void p(String imgpath){
        image=Imagedraw(imgpath);
    }
    
    
                                
    public BufferedImage Imagedraw(String 
imgpath,int lX,int lY,int X,int Y){
        BufferedImage img=null;
        x=X;y=Y;lx=lX;ly=lY;
        try{
            img = readImage(imgpath);
        }catch(Exception e){
            e.printStackTrace();
        }
        setLocation(lx,ly);
        setSize(x,y);
        return img;
    }
    public BufferedImage Imagedraw(String 
imgpath,int lX,int lY){
        lx=lX;ly=lY;
        x=10000;y=10000;
        BufferedImage img=null;
        try{
            img = readImage(imgpath);
        }catch(Exception e){
            e.printStackTrace();
        }
        setLocation(lx,ly);
        setSize(x,y);
        return img;
    }
    public BufferedImage Imagedraw(String 
imgpath){
        BufferedImage img=null;
        try{
            img = readImage(imgpath);
        }catch(Exception e){
            e.printStackTrace();
        }
        x=originalX;
        y=originalY;
        setLocation(lx,ly);
        setSize(x,y);
        return img;
    }
    
    public void setLocation(int lX, int lY){
        lx=lX;ly=lY;
        super.setLocation(lx,ly);
    }
    
                                
    public void paint(Graphics g){                
//イメージを描画
        
g.drawImage(image,0,0,x,y,startX,startY,x+startX,y
+startY,this);
    }

        
    public BufferedImage readImage(String 
path) throws IOException{
        BufferedImage img;
        img = ImageIO.read(new 
File(path));
        originalX=img.getWidth();
        originalY=img.getHeight();
        return img;
    }
    

}
回答日時 2013-02-21 09:27:41
名前
匿名
回答内容

回答を評価する
(0ポイント)
いちいち初心者と書かないと気が済まないのか…?
回答日時 2013-02-21 13:37:52
名前
匿名
回答内容

回答を評価する
(0ポイント)
投稿者です。
自己完結できました。

拙いかもしれませんが最大行の文字数maxCharを定めて
drawCharsの部分を
for(int i=0;i<maxLine;i++){
            
            if(i*maxChar < 
m.toCharArray().length && (i+1)*maxChar > 
m.toCharArray().length){
                
g.drawChars(m.toCharArray() , i*maxChar , 
m.toCharArray().length-i*maxChar , r_margin , 
t_margin+f.getSize()*i);
                
                
            }else 
if(i*maxChar<m.toCharArray().length){
                

                
g.drawChars(m.toCharArray() , i*maxChar ,maxChar , 
r_margin , t_margin+f.getSize()*i);
                
                
            }else{}

とすることで解決しました。
メッセージウェイトに対応していないのでこれから挑戦
しようと思いますのでアドバイスありましたらよろしく
お願いいたします。
回答日時 2013-02-27 10:46:59
名前
匿名
回答内容

回答を評価する
(0ポイント)
固定ピッチのフォントなら文字数での制御で良いが、可変ピ
ッチだと「次の文字の幅を足して表示域の幅を超えそうなら
改行」というロジックになる。

http://mylinux.blog42.fc2.com/blog-entry-252.html

この辺が参考になるだろう。
回答日時 2013-02-27 20:17:16

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道