2017-08-02 8 views
0

文字列の書式設定に手伝ってください。 私はString []を持っていて、結果の文字列に各文字列を追加しています。これはJOptionPaneに表示されます。各文字列を結果に追加するときは、String.format("%-20s", String[i])を使用して、最終結果に追加される各文字列の長さが20で、左揃えになっていることを確認しました。新しい行で5単語ごとに開始されます。しかし、JOptionPaneに示された結果は、私が期待した結果ではありません。単語は整列していません。各ワードは20Java文字列のフォーマットが期待通りに機能しない

private String keywordsList = "soup(s?)(base(s*))? hot(pot(s*))? " 
     + "meat(s*) poultr((y)|(ies)){1} " 
     + "beef(s?) cow(s?) ox(es)? bull(s?) " 
     + "pork(s?) pig(s?) oink " 
     + "mutton(s?) lamb(s?) sheep(s?) " 
     + "chick(en(s)*)? hen(s)* rooster(s)* " 
     + "seafood(s?) sea ocean shellfish fish((e)|(es))? " 
     + "vegetable(s?) vege(s?) green plant(s?) veg(gies)? " 
     + "signature(s?) recommendation(s?) recommend " 
     + "h(i+) hell(o)+ y(o+) h(e)+(y) " 
     + "morning afternoon evening " 
     + "love(ly)? great good thank(s)? amazing excellent brilliant outstanding wonderful awesome okay " 
     + "bad lousy useless stupid brainless fool(ish)? " 
     + "got|get provide(s)* menu(s)* suppl(y|ies){1} offer(s*) " 
     + "(good)?by(e+) leave end stop"; 

public String getKeywordList(){ 
    String [] keywordsListArray = this.keywordsList.split("\\s"); 
    String result = String.format("%-20s", keywordsListArray[0].replaceAll("[^a-z]", "")); 
    for (int i = 1; i < keywordsListArray.length; i++){ 
     keywordsListArray[i] = keywordsListArray[i].replaceAll("[^a-z]", ""); 
     if (i % 5 == 0){ 
      result += String.format("%n%-20s", keywordsListArray[i]); 
     } 
     else 
      result += String.format("%-20s", keywordsListArray[i]); 
    } 
    return result; 
} 
+0

*好奇心:* '{1}'のポイントは何ですか? – Andreas

+0

*「JOptionPaneに表示される結果は、私が期待したものではありません」*何を期待したのですか?あなたは[固定幅フォント](https://en.wikipedia.org/wiki/Monospaced_font)を使用していないためです。 – Andreas

+0

正規表現の{1}は、前の式の出現回数を指定します。この場合、「y」または「ies」が一度だけ表示されるようにしたかった –

答えて

0

チェックが最初getKeywordList()関数の結果は、あなたが期待するものであるの最小の長さを持っていないようです。例

... 
    // print out for debug 
    System.out.println(result); 
    return result; 
} 

については

だから、あなたが得る:

soupsbases   hotpots    meats    poultryies   beefs    
cows    oxes    bulls    porks    pigs     
oink    muttons    lambs    sheeps    chickens    
hens    roosters   seafoods   sea     ocean    
shellfish   fishees    vegetables   veges    green    
plants    veggies    signatures   recommendations  recommend   
hi     hello    yo     hey     morning    
afternoon   evening    lovely    great    good     
thanks    amazing    excellent   brilliant   outstanding   
wonderful   awesome    okay    bad     lousy    
useless    stupid    brainless   foolish    gotget    
provides   menus    supplyies   offers    goodbye    
leave    end     stop     

をあなたの問題はJOptionPaneのであり、あなたが&とスペースを交換する必要がありますことかもしれないより結果は、あなたが期待したものである場合nbsp;そして、\ nはところで< BR/>

return result.replaceAll(" ", "&nbsp;").replaceAll("\n", "<br/>"); 

で:あなたは...あなたは正しい整列の列を持つようにしたい場合は等幅フォントを使用する必要がありますので<前> ... </>を事前に結果をラップタグ。

+0

ああ、それは私が期待していたものです。したがって、問題はJOptionPane.showMessageDialog()です。 –

0

あなたはプリミティブな文字テキストベースのアラインメントをしようとしていますが、そのようなテクニックは、テキストがモノスペースのフォントを使用してレンダリングされていることを前提としています。しかし、JOptionPaneのデフォルトフォントは、比例した間隔のフォントである可能性があります。しかし、そのフォントをCourierのようなものにしようとすると、Swingの意図したルック・アンド・フィールを損なう可能性があるので間違っている可能性があります。テキストベースの考え方から脱却し、代わりにUI開発者のように考える方がよいでしょう。本当に欲しいのは、JTableコンポーネントのセルにキーワード文字列を配置し、それをmessage引数としてJOptionPaneに渡すことです。メッセージはStringまたはString []である必要はありません。ファーストクラスのネストされたコンポーネントオブジェクトにすることができます。

関連する問題