16

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

.

编辑

.

正如所见,我只有一种方式,其中一个和(也可以模拟平原),其中可以通过使用 Html 进行一些格式化,并在JTable事件中切换到平原,JSpinnerTableColumnTableRowJtextFieldTableRendererJTextComponentTableCellEditTableEditorJFormattedTextField

还有其他方法吗,也可以用普通的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

Use the Java2D API. The is an excellent book on it from O'Reilly.

1- Use the font you like. 2- Convert the Glyphs you need (e.g. "2" "/" and "3") into Java2D shapes. 3- Use the Java@d method to scales and place the shapes together

4- This part depends on the component. I think a lot of components take some kind of image instead of text. Convert your shapes into whatever fits into the components you w ant.

5- This should look really professional if you do a good job :)

Come on give me 50!!!

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

Thanks so much for the points. Here is an example of how to do the first step. It'll show how to get an instance of enter code here Shape from a character in the font of your choice.

Once you have your Shape You can use Graphics2D to create the image you want (scale, compose, etc). All the swing components are different but all have a graphics context. Using the graphics content you can draw on any Swing Component. You can also make transparent layers and stick a transport JPanel over anything you want. If you just want to display a fraction on a label that's easy. If you had some sort of word processor in mind that's hard.

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

特殊字体方法:

特殊字体方法也可能是一个非常好的解决方案。

您将需要一个好的字体编辑器。

为分数的顶部数字创建十个数字,为​​中间的特殊斜线或线条符号创建一个数字,为​​底部数字创建十个数字。

唯一的问题是它必须看起来不错,这需要顶部/斜线/和按钮的间距都靠近在一起,实际上是水平重叠的。好消息是字体支持这一点,一个好的字体编辑器会。摆动文本组件可能不会。您需要编写自己的文本组件来查找已经可以让您精确定位字体的组件。这是测试编辑/文字处理和文本排版之间的区别。

但我也有另一个想法:)

您可以使用水平条而不是斜线来计算分数。

123
---
456

这种方式字体不需要重叠,并且可以由编辑器以标准方式布局。诀窍是让上述三个字符彼此相邻。

1 2 3
- - -
4 5 6

因此,所有组合都需要一百个不同的字符。

唯一的问题(除了必须创建 100 个字符外)是如果您在顶部甚至底部或虎钳诗句中有奇数位数,它将如下所示:

 12
---
456
于 2011-10-11T07:29:15.907 回答