如何在Swing JComponents中渲染分数

基本上Swing JComponents能够以2 2/3forms显示分数。 如何以最好的forms绘制分数,例如2⅔?

编辑

因为我在JSpinner只有一种方式JTable ,有一个TableColumnTableRow (也可以模拟普通的JtextField ),其中TableRenderer可以是一些使用Html格式化的JTextComponent ,而在TableCellEdit事件中, TableEditor可以切换到普通的JFormattedTextField

还有另一种方式,是否可以使用普通的J(Formatted)TextField ???

经过反思, Latin-1 Supplement和Number Forms中的 Unicode分数提供有限的覆盖范围,并且花哨的方程式可能过度。 此示例在Swing组件中使用HTML

附录:所显示的方法非常适合渲染混合数字。 对于编辑,可以为文本组件中的计算器样式输入添加+/ 键绑定 。 我使用org.jscience.mathematics.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(""); sb.append(w); sb.append(""); sb.append(n); sb.append(""); sb.append("/"); sb.append(""); sb.append(d); sb.append(""); sb.append(""); 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(); } }); } } 

使用Java2D API。 这是奥莱利的优秀书籍。

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

4-这部分取决于组件。 我认为很多组件都采用某种图像而不是文本。 将您的形状转换为适合您的组件的任何形状。

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

来吧给我50!

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

非常感谢你们的观点。 以下是如何执行第一步的示例。 它将展示如何在enter code here一个enter code here的实例Shape来自您选择的字体中的字符。

获得Shape您可以使用Graphics2D创建所需的图像(缩放,构图等)。 所有的swing组件都不同,但都有图形上下文。 使用图形内容,您可以在任何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(); } } } 

您可以使用基于此http://java-sl.com/fraction_view.html的方法

唯一的区别是定位分子和分母的子视图。

Unicode有一组字符,可以让您在不必进行特殊格式化的情况下生成分数,例如⁴/₉或⁵⁶/ 10 0。

您可以设置一个上标数字数组和一个下标数字数组,并将您的数字转换为这些数字的字符串,然后将它们与中间的分数斜杠组合。

优点是它更通用(您可以在其他上下文中使用代码),并且结果往往看起来比您尝试使用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; } 

你必须找到一个字体,用你打印最好的forms打印分数,然后编写一个方法将你的分数的字符串转换成相应的最好的forms分数的字符代码。

特殊字体方法:

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

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

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

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

但我还有另一个想法:)

你可以使用水平条而不是斜线来做分数。

 123 --- 456 

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

 1 2 3 - - - 4 5 6 

因此,所有组合都需要100个不同的角色。

这个问题的唯一问题(除了必须创建100个字符)是如果你有顶部甚至底部的奇数位数或vise经文,它将如下所示:

  12 --- 456