Vraag Hoe renderde breuken in Swing JComponents


In principe kunnen Swing JComponents cijfers in fracties in deze vorm weergeven 2 2/3. Hoe kan ik fractie in de mooiste vorm verven, bijvoorbeeld 2⅔?

.

BEWERK

.

zoals zie heb ik maar één manier JTable binnen JSpinner met een TableColumn en TableRow (dat kon simpelweg worden gesimuleerd JtextField ook), waar TableRenderer zou een deel van kunnen zijn JTextComponent opgemaakt met Html en aan TableCellEdit evenement de TableEditor om naar de vlakte te zwaaien JFormattedTextField,

is er een andere manier, zou het mogelijk zijn met het duidelijke J(Formatted)TextField ook ???


16
2017-09-16 17:14


oorsprong


antwoorden:


Bij nader inzien breekt Unicode-breuken tussen de Latin-1 supplement en Nummerformulieren bieden beperkte dekking, en mooie vergelijkingen misschien overkill. Dit voorbeeld gebruikt HTML in Swing-componenten.

Addendum: De getoonde benadering leent zich redelijk goed voor het weergeven van gemengde getallen. Voor bewerking, sneltoetsen naar + en / kan worden toegevoegd voor invoer in rekenmachinestijl in een tekstcomponent. Ik heb gebruikt org.jscience.mathematics.number.Rational om rationale getallen te modelleren, en dit parser zou kunnen worden aangepast om rationele uitdrukkingen te evalueren.

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

21
2017-09-17 02:40



Gebruik de Java2D API. Het is een uitstekend boek hierover van O'Reilly.

1- Gebruik het lettertype dat u wilt. 2- Converteer de Glyphs die u nodig hebt (bijvoorbeeld "2" "/" en "3") naar Java2D-vormen. 3- Gebruik de methode Java @ d om te schalen en de vormen samen te plaatsen

4- Dit onderdeel is afhankelijk van het onderdeel. Ik denk dat veel componenten een soort afbeelding hebben in plaats van tekst. Converteer je vormen naar wat past in de componenten die je wilt.

5- Dit zou er echt professioneel uit moeten zien als je het goed doet :)

Kom op geef me 50 !!!

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

Heel erg bedankt voor de punten. Hier is een voorbeeld van hoe u de eerste stap moet doen. Het laat zien hoe je een exemplaar krijgt enter code here Vorm van een personage in het lettertype van je keuze.

Als je eenmaal je hebt Shape U kunt Graphics2D gebruiken om de gewenste afbeelding te maken (schaal, compositie, enz.). Alle swingcomponenten zijn verschillend maar hebben allemaal een grafische context. De grafische inhoud gebruiken die u op elke Swing Component kunt tekenen. U kunt ook transparante lagen maken en een transport-JPanel plakken over alles wat u maar wilt. Als u slechts een fractie van een etiket wilt weergeven, is dat eenvoudig. Als je een tekstverwerker in gedachten had, is dat moeilijk.

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

5
2017-10-10 05:02



U kunt de aanpak op basis hiervan gebruiken http://java-sl.com/fraction_view.html

Het enige verschil is het positioneren van subvisies voor teller en noemer.


5
2017-10-11 05:35



Unicode heeft een reeks tekens waarmee u breuken kunt produceren zonder speciale opmaak, bijvoorbeeld ⁴/₉ of ⁵⁶/₁₀₀.

U kunt een reeks superscriptcijfers en een reeks subscriptcijfers instellen en uw getallen converteren naar reeksen van deze cijfers en ze vervolgens combineren met de breukstreep ertussen.

Voordelen zijn dat het algemener is (je kunt de code in andere contexten gebruiken), en het resultaat ziet er meestal beter uit dan wanneer je zou proberen het te reproduceren met HTML-opmaak. Natuurlijk moet u Unicode-lettertypen op uw systeem hebben, maar de meeste systemen tegenwoordig.

Een mogelijke implementatie in code:

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

4
2017-10-12 12:21



Je zou een lettertype moeten vinden dat breuken afdrukt in wat je het leukste formulier noemt, en dan een methode schrijven om de tekenreeks van je breuk om te zetten in de tekencode van de overeenkomstige fraaiste vormfractie.


3
2017-09-16 17:24



Speciale lettertype methode:

De speciale lettertypemethode kan ook een heel goede oplossing zijn.

Je hebt een goede font-editor nodig.

Maak tien getallen alleen voor het bovenste getal van de breuk, een speciale schuine streep of een lijnsymbool voor het midden en tien cijfers alleen voor de onderste cijfers.

Het enige probleem is dat het er goed uit moet zien en dat vereist dat de afstand tussen de bovenste / schuine streep / en de knop allemaal dicht bij elkaar ligt en horizontaal overlapt. Het goede nieuws is dat lettertypen dit ondersteunen, en een goede font-editor. De swingtekstcomponenten waarschijnlijk niet. U moet uw eigen tekstcomponent schrijven om een ​​onderdeel te vinden waarmee u de lettertypen al goed kunt positioneren. Dit is het verschil tussen testbewerking / tekstverwerking en teksttypografie.

Maar ik heb ook een ander idee :)

U kunt breuken met een horizontale balk in plaats van een diagonale schuine streep.

123
---
456

Op deze manier hoeft het lettertype niet te overlappen en kan het op een standaard manier door de editor worden opgemaakt. De truc is om bovenstaande drie karakters naast elkaar te hebben.

1 2 3
- - -
4 5 6

Dus dat zijn honderd verschillende karakters die je nodig hebt voor alle combinaties.

Het enige probleem met dit (naast het hebben van 100 karakters) is als je een oneven aantal cijfers hebt bovenaan en zelfs onderaan of bankschroef het er als volgt uitziet:

 12
---
456

2
2017-10-11 07:29