2017-08-02 36 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」或「iies」只出現一次。 –

回答

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/>"); 

BTW:你將不得不如果你想有一個正確對齊列使用等寬字體...所以在<預> ... < /預>包結果標籤。

+0

哦,我的好,那就是我的期望。所以問題是JOptionPane.showMessageDialog(); –

0

您正在嘗試進行基於原始字符文本的對齊,但這種技術假定文本正在使用等寬字體進行渲染。但是JOptionPane的默認字體很可能是按比例分隔的字體。但試圖將其字體設置爲像Courier這樣的概念可能是錯誤的想法,因爲這會破壞Swing的預期外觀和感覺。最好突破基於文本的思維,而是像UI開發人員那樣思考。您真正需要的是在JTable組件的單元格中排列關鍵字字符串,並將其作爲message參數傳遞給JOptionPane。該消息不一定是StringString []。它可以是一流的嵌套組件對象。

相關問題