如何在Swing JComponents中渲染分数

mKo*_*bel 16 java swing jspinner fractions jformattedtextfield

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

.

编辑

.

因为看到我只有一个办法JTable里面JSpinner有一个TableColumnTableRow(可能普通的模拟JtextField太),其中TableRenderer可能会有一些的JTextComponent格式化使用HTML和TableCellEdit事件TableEditor,以SWITH到平原JFormattedTextField,

还有另一种方式,是否有可能与平原J(Formatted)TextField???

tra*_*god 23

经过反思,Latin-1 SupplementNumber 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("<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();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你可能遇到的一个问题是,在`JLabel`中使用HTML是支持它的`LayoutManager`失去基线对齐(OTOH,`GroupLayout`,`MigLayout`,`DesignGridLayout`可能有其他人......)不确定如果那在你的用例中那么重要的话. (3认同)

Gle*_*n P 5

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

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

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

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

来吧给我50!

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

非常感谢你们的观点.以下是如何执行第一步的示例.它将展示如何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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Sta*_*avL 5

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

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


Gil*_*anc 3

您必须找到一种以您所说的最好形式打印分数的字体,然后编写一个方法将分数的字符串转换为相应最好形式分数的字符代码。