representar - pasar de decimal a fraccion java
Cómo hacer fracciones en Swing JComponents (6)
Básicamente, los componentes de Swing J pueden mostrar números en fracciones de esta forma 2 2/3
. ¿Cómo puedo pintar la fracción en la forma más bonita, por ejemplo 2⅔?
.
EDITAR
.
Como veo, solo tengo una forma de JTable
dentro de JSpinner
con una TableColumn
y TableRow
(que también podría simular JtextField
simple), donde TableRenderer
podría ser algo de JTextComponent
formateado usando Html y en el evento TableCellEdit
el TableEditor
para TableEditor
al JFormattedTextField
plano
¿Hay alguna otra forma, podría ser posible con el campo de texto J(Formatted)TextField
simple?
Puede utilizar el enfoque basado en este http://java-sl.com/fraction_view.html
La única diferencia es posicionar subvistas para numerador y denominador.
Reflexionando, las fracciones de Unicode entre el Suplemento Latin-1 y las formas numéricas ofrecen una cobertura limitada, y las ecuaciones de fantasía pueden ser una exageración. Este ejemplo utiliza HTML en los componentes Swing .
Anexo: El enfoque que se muestra se presta bastante bien para representar números mixtos. Para la edición, los enlaces de teclas a +
y /
podrían agregarse para la entrada de estilo calculadora en un componente de texto. He usado org.jscience.mathematics.number.Rational
para modelar números racionales, y este parser podría adaptarse para evaluar expresiones racionales.
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://.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();
}
});
}
}
Tendría que encontrar una fuente que imprima fracciones en lo que está llamando la mejor forma, luego escriba un método para convertir la cadena de caracteres de su fracción en el código de la fracción de forma correspondiente más agradable.
Unicode tiene un conjunto de caracteres que le permitirán producir fracciones sin tener que realizar un formateo especial, por ejemplo, ⁵⁶⁄₁₀₀ o ⁵⁶⁄₁₀₀.
Puede configurar una matriz de dígitos superíndices y una matriz de dígitos de subíndices, y convertir sus números en cadenas de estos dígitos, y luego combinarlos con la barra de fracción entre ellos.
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 intentara reproducirlo utilizando el formato HTML. Por supuesto, necesita tener fuentes Unicode en su sistema, pero la mayoría de los sistemas lo tienen 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;
}
Utilice la API de Java2D. Es un excelente libro sobre él de O''Reilly.
1- Usa la fuente que te gusta. 2- Convierta los glifos que necesita (por ejemplo, "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 parecer realmente 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
de enter code here
Forma de un carácter en la fuente de tu elección.
Una vez que tenga su Shape
, puede usar Graphics2D para crear la imagen que desea (escalar, componer, etc.). Todos los componentes de swing son diferentes pero todos tienen un contexto gráfico. 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 tuvieras algún tipo de procesador de textos en mente, 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();
}
}
}
Método de fuentes especiales:
El método de fuentes especiales también puede ser una muy buena solución.
Vas a necesitar un buen editor de fuentes.
Cree diez números solo para el número superior de la fracción, una barra o un símbolo de línea especial 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 espacio entre la parte superior / barra / y el botón y todos juntos, se superpongan horizontalmente. La buena noticia es que las fuentes son compatibles con esto, y un buen editor de fuentes lo hará. Los componentes de texto swing probablemente no lo hacen. Necesita escribir su propio componente de texto para encontrar un componente que ya le permita ubicar con precisión las fuentes. 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ías hacer fracciones con una barra horizontal en lugar de una barra diagonal.
123
---
456
De este modo, la fuente no debe superponerse y el editor puede distribuirla de forma estándar. El truco es tener los tres caracteres anteriores uno al lado del otro.
1 2 3
- - -
4 5 6
Así que son cien personajes diferentes que necesitas para todas las combinaciones.
El único problema con esto (además de tener que crear 100 caracteres) es si tiene un número impar de dígitos en la parte superior e incluso en la parte inferior o en el verso de la ventana, se verá así:
12
---
456