Cómo renderizar fracción en Swing JComponents

Básicamente los JComponentes Swing pueden mostrar números en fracciones en esta forma 2 2/3 . ¿Cómo puedo pintar la fracción en la forma más bonita, por ejemplo 2⅔?

.

EDITAR

.

como veo, tengo solo una forma JTable dentro de JSpinner con una TableColumn y TableRow (que también podría simular JtextField ), donde TableRenderer podría ser parte de JTextComponent formateado usando Html y en el evento TableCellEdit el TableEditor para TableEditor al TableEditor JFormattedTextField ,

¿Hay alguna otra manera, podría ser posible con J(Formatted)TextField llano J(Formatted)TextField también ???

Como reflection, las fracciones Unicode entre el Suplemento Latin-1 y los Formularios Numéricos ofrecen una cobertura limitada, y las ecuaciones fantasiosas pueden ser excesivas. Este ejemplo usa HTML en Swing Components .

Adición: El enfoque mostrado se presta bastante bien a la representación de números mixtos. Para la edición, se podrían agregar enlaces de teclas a + y / para la entrada de estilo de calculadora en un componente de texto. He usado org.jscience.mathematics.number.Rational para modelar números racionales, y este analizador podría adaptarse a la evaluación de expresiones racionales.

HTMLFracciones

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

Usa la API de Java2D. El es un excelente libro de O’Reilly.

1- Usa la fuente que te gusta. 2- Convierte los glifos que necesitas (p. Ej., “2” “/” y “3”) en formas Java2D. 3- Usa el método Java @ d para escalar y colocar las formas juntas

4- Esta parte depende del componente. Creo que muchos componentes toman algún tipo de imagen en lugar de texto. Convierte tus formas en lo que encaja en los componentes que deseas.

5- Esto debería verse muy profesional si haces un buen trabajo 🙂

Vamos, dame 50!

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

Muchas gracias por los puntos. Aquí hay un ejemplo de cómo hacer el primer paso. Mostrará cómo obtener una instancia de enter code here Forma de un personaje en la fuente de su elección.

Una vez que tenga su Shape , puede usar Graphics2D para crear la imagen que desea (escala, composición, etc.). Todos los componentes de swing son diferentes pero todos tienen un contexto de gráficos. Usando el contenido de gráficos puedes dibujar en cualquier Componente Swing. También puede hacer capas transparentes y pegar un JPanel de transporte sobre cualquier cosa que desee. Si solo quieres mostrar una fracción en una etiqueta, es fácil. Si tienes en mente algún tipo de procesador de textos, eso es difícil.

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

Puede usar el enfoque basado en este http://java-sl.com/fraction_view.html

La única diferencia es ubicar las subvistas para el numerador y el denominador.

Unicode tiene un conjunto de caracteres que le permitirán producir fracciones sin tener que hacer un formateo especial, por ejemplo, ⁴/₉ o ⁵⁶/₁₀₀.

Puede configurar una matriz de dígitos superíndices, y una matriz de dígitos subíndices, y convertir sus números en cadenas de estos dígitos, y luego combinarlos con la fracción de barra en el medio.

Las ventajas son que es más general (puede usar el código en otros contextos), y el resultado tenderá a verse mejor que si tratara de reproducirlo con formato HTML. Por supuesto, necesita tener fonts Unicode en su sistema, pero la mayoría de los sistemas lo hacen en estos días.

Una posible implementación en código:

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

Tendría que encontrar una fuente que imprima fracciones en lo que llama mejor forma, luego escriba un método para convertir la cadena de caracteres de su fracción en el código de caracteres de la fracción de forma más agradable correspondiente.

Método de fonts especiales:

El método de fonts especiales también podría ser una buena solución.

Necesitarás un buen editor de fonts.

Cree diez números solo para el número superior de la fracción, un símbolo especial de barra o línea para el centro y diez números solo para los dígitos inferiores.

El único problema es que tiene que verse bien y eso requiere que el espaciado de los botones de arriba / barra / y todos estén juntos, en realidad superponiéndose horizontalmente. La buena noticia es que las fonts admiten esto, y un buen editor de fonts lo hará. Los componentes de texto oscilante probablemente no. Necesita escribir su propio componente de texto para encontrar un componente que ya le permita ubicar correctamente las fonts. Esta es la diferencia entre la edición de prueba / procesamiento de textos y la tipografía de texto.

Pero también tengo otra idea 🙂

Podría hacer fracciones con una barra horizontal en lugar de una barra diagonal.

 123 --- 456 

De esta forma, la fuente no debe superponerse y el editor puede diseñarla de la manera estándar. El truco es que los anteriores sean tres caracteres uno al lado del otro.

 1 2 3 - - - 4 5 6 

Así que son cien los personajes diferentes que necesitas para todas las combinaciones.

El único problema con esto (además de tener que crear 100 caracteres) es si tienes un número impar de dígitos en la parte superior e incluso en la parte inferior o viceversa, se verá así:

  12 --- 456