16

基本的に、Swing JComponentsは、この形式で数値を分数で表示できます2 2/3。分数を最も良い形、たとえば2⅔でペイントするにはどうすればよいですか?

編集

JTableご覧のとおり、内部JSpinnerには1つの方法しかありませんTableColumnTableRowプレーンをシミュレートすることもできJtextFieldます)。ここで、Htmlを使用してフォーマットし、イベントでプレーンに切り替えることTableRendererができます。JTextComponentTableCellEditTableEditorJFormattedTextField

別の方法はありますか、それはプレーンでも可能でしょうJ(Formatted)TextFieldか?

4

6 に答える 6

23

振り返ってみると、 Latin-1 SupplementNumber Formsの間の Unicode 分数はカバー範囲が限られており、手の込んだ方程式はやり過ぎかもしれません。この例では、Swing コンポーネントで HTML を使用しています。

補遺: 示されているアプローチは、混合数のレンダリングにかなり適しています。編集用に、テキスト コンポーネントの電卓スタイルの入力用に および へのキーバインドを追加できます。私は有理数のモデル化を行ってきましたが、このパーサーは有理式の評価に適用できます。+/org.jscience.mathematics.number.Rational

HTML分数

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();
            }
        });
    }
}
于 2011-09-17T02:40:38.557 に答える
5

Java2D API を使用します。O'Reilly からの優れた書籍です。

1-好きなフォントを使用してください。2- 必要なグリフ (例: "2" "/" と "3") を Java2D 形状に変換します。3-Java@dメソッドを使用して、形状を拡大縮小して一緒に配置します

4- この部分はコンポーネントによって異なります。多くのコンポーネントは、テキストではなく何らかの画像を採用していると思います。形状を必要なコンポーネントに適合するものに変換します。

5- うまくやれば、これは本当にプロフェッショナルに見えるはずです :)

私に50をください!

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

ポイントをありがとうございました。最初のステップを実行する方法の例を次に示します。enter code here選択したフォントの文字から Shapeのインスタンスを取得する方法を示します。

取得したら、ShapeGraphics2D を使用して、必要な画像 (スケーリング、構成など) を作成できます。すべてのスイング コンポーネントは異なりますが、すべてグラフィック コンテキストがあります。グラフィックコンテンツを使用して、任意の 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();
    }
  }
}
于 2011-10-10T05:02:10.803 に答える
5

このhttp://java-sl.com/fraction_view.htmlに基づくアプローチを使用できます

唯一の違いは、分子と分母のサブビューの配置です。

于 2011-10-11T05:35:06.320 に答える
4

Unicode には、⁴⁄₉ や ⁵⁶⁄₁₀₀ など、特別な書式を設定しなくても分数を生成できる一連の文字があります。

上付き数字の配列と下付き数字の配列を設定し、数値をこれらの数字の文字列に変換してから、それらを間に小数のスラッシュで結合できます。

利点は、より一般的であり (他のコンテキストでコードを使用できる)、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;
}
于 2011-10-12T12:21:39.763 に答える
3

あなたはあなたが最も良い形と呼んでいるもので分数を印刷するフォントを見つけなければならないでしょう、そしてあなたの分数の文字列を対応する最も良い形の分数の文字コードに変換するメソッドを書く必要があります。

于 2011-09-16T17:24:27.760 に答える
2

特殊フォントの方法:

特別なフォントの方法も本当に良い解決策かもしれません.

優れたフォント エディターが必要になります。

分数の一番上の数字だけに 10 個の数字を作成し、真ん中に特殊なスラッシュまたは線記号を、下の数字だけに 10 個の数字を作成します。

唯一の問題は、見栄えを良くする必要があることです。そのためには、上部/スラッシュ/およびボタンの間隔をすべて近づけて、実際には水平方向に重ねる必要があります。良いニュースは、フォントがこれをサポートしていることであり、優れたフォント エディターはサポートします。スイング テキスト コンポーネントはおそらくそうではありません。フォントを微調整できる独自のテキスト コンポーネントを作成する必要があります。これは、テスト編集/ワード プロセッシングとテキスト タイポグラフィの違いです。

しかし、私には別のアイデアもあります:)

斜めのスラッシュの代わりに横棒を使って分数を計算できます。

123
---
456

この方法では、フォントはオーバーラップする必要がなく、エディターによって標準的な方法でレイアウトできます。コツは、上記の 3 文字を隣り合わせにすることです。

1 2 3
- - -
4 5 6

つまり、すべての組み合わせに必要な 100 の異なる文字です。

これに関する唯一の問題 (100 文字を作成する必要があることに加えて) は、上に奇数の桁があり、下または万力の詩にさえある場合、次のようになります。

 12
---
456
于 2011-10-11T07:29:15.907 に答える