如何在 Swing JComponents 中渲染分数

基本上,Swing JComponents能够以这种形式以分数形式显示数字。如何以最好的形式绘制分数,例如22/3?2 2/3

.

编辑

.

正如看到我只有一种方式里面与一个和(那也可以模拟平原),在那里可以格式化一些通过使用Html和事件切换到平原,JTableJSpinnerTableColumnTableRowJtextFieldTableRendererJTextComponentTableCellEditTableEditorJFormattedTextField

有没有另一种方式,有没有可能用平原太???J(Formatted)TextField


答案 1

经过反思,拉丁语-1补充数字形式之间的Unicode分数提供的覆盖范围有限,花哨的方程式可能有些过分。此示例在 Swing 组件中使用 HTML

附录:所示的方法非常适合呈现混合数字。对于编辑,可以为文本组件中的计算器样式输入添加键绑定。我使用 org.jscience.math.number.Rational 对有理数进行建模,这个解析器可以适应于评估有理表达式。+/

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();
            }
        });
    }
}

答案 2

使用 Java2D API。这是O'Reilly的一本关于它的优秀书籍。

1-使用您喜欢的字体。2-将您需要的字形(例如“2”“/”和“3”)转换为Java2D形状。3-使用Java@d方法缩放并将形状放在一起

4-此部分取决于组件。我认为很多组件需要某种图像而不是文本。将您的形状转换为适合您所选择的组件的任何形状。

5-如果你做得很好,这应该看起来很专业:)

来吧,给我50!!!

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

非常感谢您的积分。下面是如何执行第一步的示例。它将演示如何从所选字体的字符中获取 Shape 的实例。enter code here

拥有后,您可以使用Graphics2D创建所需的图像(缩放,撰写等)。所有摆动组件都不同,但都有图形上下文。使用图形内容,您可以在任何 Swing 组件上绘制。您还可以制作透明图层,并在您想要的任何东西上粘贴传输JPanel。如果您只想在标签上显示分数,那很容易。如果你有某种文字处理器,那很难。Shape

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();
    }
  }
}

推荐