2011-09-16 71 views
16

基本上Swing JComponents能夠以此形式2 2/3以分數顯示數字。我怎樣才能以最好的形式畫分數,例如2?如何在Swing JComponents中渲染分數

編輯

因爲看到我只有一個辦法JTableJSpinner一個TableColumnTableRow(即可以模擬普通JtextField太),其中TableRenderer可能是一些JTextComponent通過使用HTML和格式上TableCellEdit事件TableEditor到SWITH到平原JFormattedTextField,

有沒有另外一種方式,用普通的J(Formatted)TextField也可以嗎?

+0

你能細說什麼更多的細節將是有益的? – trashgod

+0

???我確定 ???必須可以將格式設置爲JSpinner或JFormattedTextField,因爲我看到Java GUI在小數點分隔符之前有更大的藍色和更大的數字,就像在另一個小數位上的紅色和小數點一樣,這看起來非常好,與我在我的問中一樣問題 – mKorbel

+0

啊,也許是市場交易中使用的自定義組件。感謝澄清。對不起,我在這方面沒有太多經驗。 – trashgod

回答

3

你將不得不找到一個字體,打印你調用最好的窗體的分數,然後寫一個方法將你的分數的字符串轉換爲相應最好的窗體分數的字符代碼。

+0

+1。我對安裝特殊字體​​不太樂觀。你能否詳細說明實用性? – trashgod

+0

@trashgod:我開始使用Microsoft Word,並查看Times New Roman字體的符號表。分數1/3(字符碼x'2153'),2/3(x'2154'),1/8(x'215B'),3/8(x'215C'),5/8(x' 215D')和7/8(x'215E')具有字符代碼。 1/4(x'00BC'),1/2(x'00BD')和3/4(x'00BE')具有字符代碼。如果你只需要八分之一的分數,那麼這種方法就可以工作。 –

+0

啊,我可以使用FontBook應用程序在Mac上看到這些代碼點的字形。 – trashgod

21

經過反思,Latin-1 SupplementNumber Forms之間的Unicode分數提供了有限的覆蓋範圍,並且fancy equations可能是矯枉過正的。本例使用HTML in Swing Components

附錄:顯示的方法非常適合渲染混合數字。對於編輯,可以添加key bindings+/以用於文本組件中的計算器式輸入。我用org.jscience.mathematics.number.Rational來模擬有理數,並且這個parser可以適用於評估有理表達式。

HTMLFractions

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.GridLayout; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

/** @see https://stackoverflow.com/questions/7448216 */ 
public class HTMLFractions extends JPanel { 

    private static int N = 8; 

    public HTMLFractions() { 
     this.setLayout(new GridLayout(N, N, N, N)); 
     this.setBorder(BorderFactory.createEmptyBorder(N, N, N, N)); 
     for (int r = 0; r < N; r++) { 
      for (int c = 0; c < N; c++) { 
       this.add(create(r + N, r + 1, c + 2)); 
      } 
     } 
    } 

    private JLabel create(int w, int n, int d) { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("<html><body>"); 
     sb.append(w); 
     sb.append("<sup>"); 
     sb.append(n); 
     sb.append("</sup>"); 
     sb.append("<font size=+1>/<font size=-1>"); 
     sb.append("<sub>"); 
     sb.append(d); 
     sb.append("</sub>"); 
     sb.append("</html></body>"); 
     JLabel label = new JLabel(sb.toString(), JLabel.CENTER); 
     label.setBorder(BorderFactory.createLineBorder(Color.lightGray)); 
     return label; 
    } 

    private void display() { 
     JFrame f = new JFrame("HTMLFractions"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new HTMLFractions().display(); 
      } 
     }); 
    } 
} 
+0

現在我真的不知道怎麼解決,什麼只是困擾如何SWITH爲純TextComponents /拆分輸入掩碼和格式顯示...,+1 – mKorbel

+0

我還沒有看到一個輕量級的,開源的解決方案,但我上面提出了一種方法。 – trashgod

+0

hmmm'開放源代碼解決方案'我有一些解決方案可以讓我重新實現市場交易和保證金,從他們的任何非開放源代碼解決方案和非解決交易InputMasks,內置視圖是情況有點不同(包括公式),但不能是那麼好,因爲我從你的帖子'2⅔' – mKorbel

5

使用的Java2D API。這是來自O'Reilly的一本很好的書。

1-使用您喜歡的字體。 2-將您需要的字形(例如「2」,「/」和「3」)轉換爲Java2D形狀。 3-使用Java @ d方法縮放和放置形狀在一起

4-這部分取決於組件。我認爲很多組件會採用某種圖像而不是文本。將你的形狀轉換成任何適合你的組件的東西。

5這應該看,如果你做好了:)

快點給我50真正的專業!

=============

非常感謝您的意見。以下是如何執行第一步的示例。它將顯示如何從您選擇的字體中的角色獲取enter code here形狀的實例。

一旦你有你的Shape你可以使用Graphics2D來創建你想要的圖像(比例,組成等)。所有的擺動組件都不同,但都有一個圖形上下文。使用圖形內容可以在任何Swing組件上繪製。您還可以製作透明圖層並將傳輸JPanel粘貼到任何您想要的內容上。如果您只想在容易的標籤上顯示分數。如果你有某種文字處理器,那很難。

import java.awt.Font; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.Shape; 
import java.awt.font.GlyphVector; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.GeneralPath; 
import java.awt.geom.Point2D; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 

public class Utils { 

    public static Shape generateShapeFromText(Font font, char ch) { 
    return generateShapeFromText(font, String.valueOf(ch)); 
    } 

    public static Shape generateShapeFromText(Font font, String string) { 
    BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2 = img.createGraphics(); 

    try { 
     GlyphVector vect = font.createGlyphVector(g2.getFontRenderContext(), string); 
     Shape shape = vect.getOutline(0f, (float) -vect.getVisualBounds().getY()); 

     return shape; 
    } finally { 
     g2.dispose(); 
    } 
    } 
} 
+0

*「來吧,給我50 !!!」*賞金可以被授予一次,整體。這是'全部或全部'。但我會折騰你10;) –

+0

@Andrew湯普森:-)爲什麼不呢,我給了250,善意的玩笑,是不是 – mKorbel

+0

@Glen P此非SENCE值得我賞金250 – mKorbel

2

特殊字體的方法:

特殊字體,方法可能是一個很好的解決方案了。

你將需要一個好的字體編輯器。

只爲分數的頂部數字創建十個數字,中間是一個特殊的斜線或線條符號,以及僅爲底部數字的十個數字。

唯一的問題是它看起來不錯,而且要求頂部/斜槓/和按鈕的間距都接近在一起,實際上水平重疊。好消息是字體支持這個,一個好的字體編輯器會。擺動文本組件可能不會。你需要編寫自己的文本組件來查找一個組件,該組件可以讓你精確定位字體。這是測試編輯/文字處理和文字排版的不同之處。

但我也有另外一種想法:)

你可以做分數有單槓,而不是斜線。

123 
--- 
456 

這種字體不需要重疊,可以通過編輯器以標準方式進行佈局。訣竅是讓上面的三個字符相鄰。

1 2 3 
- - - 
4 5 6 

因此,這是所有組合需要的一百個不同的字符。

本(除了具有創建100個字符)唯一的問題是,如果你有和奇數的頂部,即使在底部或臺鉗詩句它看起來像這樣的數字:

12 
--- 
456 
4

Unicode有一組字符,可讓您在不必進行特殊格式化的情況下生成分數,例如4/8或5/5/100。

您可以設置上標數字和下標數字數組,並將您的數字轉換爲這些數字的字符串,然後將它們與中間的分數斜槓組合。

優點是它更通用(您可以在其他上下文中使用代碼),並且結果往往比您嘗試使用HTML格式重現它的效果更好。當然,你需要在你的系統上使用Unicode字體,但是現在大多數系統都是這樣做的。

在代碼中可能的實現:

public String diagonalFraction(int numerator, int denominator) { 
    char numeratorDigits[] = new char[]{ 
      '\u2070','\u00B9','\u00B2','\u00B3','\u2074', 
      '\u2075','\u2076','\u2077','\u2078','\u2079'}; 
    char denominatorDigits[] = new char[]{ 
      '\u2080','\u2081','\u2082','\u2083','\u2084', 
      '\u2085','\u2086','\u2087','\u2088','\u2089'}; 
    char fractionSlash = '\u2044'; 

    String numeratorStr = new String(); 
    while(numerator > 0){ 
     numeratorStr = numeratorDigits[numerator % 10] + numeratorStr; 
     numerator = numerator/10; 
    } 
    String denominatorStr = new String(); 
    while(denominator > 0){ 
     denominatorStr = denominatorDigits[denominator % 10] + denominatorStr; 
     denominator = denominator/10; 
    } 
    return numeratorStr + fractionSlash + denominatorStr; 
} 
+1

另請參見[上標和下標](http://www.unicode.org/charts/PDF/U2070.pdf)。 – trashgod