2011-09-16 40 views
16

Về cơ bản Swing JComponents có thể hiển thị số trong phân số theo dạng này 2 2/3. Làm thế nào tôi có thể vẽ phần nhỏ ở dạng đẹp nhất, ví dụ 2⅔?Làm thế nào để kết xuất phần trong các thành phần Swing

.

EDIT

.

như thấy tôi có một cách duy nhất JTable bên JSpinner với một TableColumnTableRow (mà có thể mô phỏng đồng bằng JtextField quá), nơi TableRenderer có thể là một số JTextComponent định dạng bằng cách sử dụng Html và trên TableCellEdit sự kiện TableEditor để Swith để đồng bằng JFormattedTextField,

có cách nào khác, có thể thực hiện được với đồng bằng J(Formatted)TextField quá ???

+0

Bạn có thể xây dựng trên những chi tiết bổ sung sẽ là hữu ích không? – trashgod

+0

??? Tôi chắc chắn ???có thể đặt Định dạng thành JSpinner hoặc JFormattedTextField, vì tôi thấy Java GUI có số màu xanh dương và đậm hơn trước dấu phân tách thập phân, như màu đỏ và smaler trên một số thập phân khác, trông rất đẹp, giống như tôi đã hỏi trong câu hỏi – mKorbel

+0

Ah, có lẽ là một thành phần tùy chỉnh được sử dụng trong giao dịch thị trường. Cảm ơn bạn đã làm rõ. Xin lỗi, tôi không có nhiều kinh nghiệm về vấn đề đó. – trashgod

Trả lời

3

Bạn sẽ phải tìm một phông chữ in phân số theo thứ bạn đang gọi là biểu mẫu đẹp nhất, sau đó viết một phương thức để chuyển chuỗi ký tự của phân số thành mã ký tự của phần biểu mẫu đẹp nhất tương ứng.

+0

+1 cho một ý tưởng kết xuất tốt. Tôi ít lạc quan về việc cài đặt các phông chữ đặc biệt. Bạn có thể xây dựng trên thực tế không? – trashgod

+0

@trashgod: Tôi bắt đầu Microsoft Word và xem bảng biểu tượng cho phông chữ Times New Roman. Các phân số 1/3 (mã ký tự x'2153 '), 2/3 (x'2154'), 1/8 (x'215B '), 3/8 (x'215C'), 5/8 (x ' 215D ') và 7/8 (x'215E') có mã ký tự. 1/4 (x'00BC '), 1/2 (x'00BD') và 3/4 (x'00BE ') có mã ký tự. Nếu bạn chỉ cần phân số của một phần tám, hơn phương pháp này có thể làm việc. –

+0

Ah, tôi có thể thấy glyphs cho các mã-điểm trên Mac bằng cách sử dụng ứng dụng 'FontBook'. – trashgod

21

Trên phản ánh, các phân số Unicode trong số các mức độ giới hạn cung cấp Latin-1 SupplementNumber Forms có giới hạn và fancy equations có thể quá mức cần thiết. Ví dụ này sử dụng HTML in Swing Components.

Phụ lục: Cách tiếp cận hiển thị chính nó khá tốt để hiển thị số hỗn hợp. Để chỉnh sửa, key bindings đến +/ có thể được thêm vào cho kiểu nhập kiểu máy tính trong một thành phần văn bản. Tôi đã sử dụng org.jscience.mathematics.number.Rational để lập mô hình số hợp lý và điều này parser có thể được điều chỉnh để đánh giá các biểu thức hợp lý.

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

bây giờ tôi thực sự không có ý tưởng làm thế nào để giải quyết, không có gì chỉ làm phiền làm thế nào để swith/tách mặt nạ đầu vào và hiển thị định dạng cho TextComponents đồng bằng ..., +1 – mKorbel

+0

Tôi đã không nhìn thấy một trọng lượng nhẹ, giải pháp mã nguồn mở, nhưng tôi đã đề xuất một cách tiếp cận ở trên. – trashgod

+0

hmmm 'giải pháp nguồn mở' Tôi có aroung cho tôi một vài giải pháp cho reall MarketTrading & Margining, bất kỳ giải pháp nào không phải mã nguồn mở và không giải quyết cho Giao dịch InputMasks, cho chế độ xem tích hợp là các tình huống hơi khác nhau (bao gồm công thức), nhưng không đẹp như tôi đã sao chép từ bài đăng của bạn '2⅔' – mKorbel

5

Sử dụng API Java2D. Đây là một cuốn sách tuyệt vời về nó từ O'Reilly.

1- Sử dụng phông chữ bạn thích. 2- Chuyển đổi các Glyph bạn cần (ví dụ: "2" "/" và "3") thành các hình dạng Java2D. 3- Sử dụng phương pháp Java @ d để cân và đặt các hình dạng lại với nhau

4- Phần này phụ thuộc vào thành phần. Tôi nghĩ rằng rất nhiều thành phần có một số loại hình ảnh thay vì văn bản. Chuyển đổi hình dạng của bạn thành bất cứ điều gì phù hợp với các thành phần bạn w kiến.

5- Điều này sẽ trông thực sự chuyên nghiệp nếu bạn làm tốt công việc :)

Hãy cho tôi 50 !!!

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

Cảm ơn rất nhiều về điểm. Đây là một ví dụ về cách thực hiện bước đầu tiên. Nó sẽ cho thấy cách để có được một thể hiện của enter code here Hình dạng từ một ký tự trong phông chữ mà bạn chọn.

Khi bạn có Shape Bạn có thể sử dụng Graphics2D để tạo hình ảnh bạn muốn (tỷ lệ, soạn, v.v.). Tất cả các thành phần swing đều khác nhau nhưng tất cả đều có ngữ cảnh đồ họa. Sử dụng nội dung đồ họa bạn có thể vẽ trên bất kỳ thành phần Swing nào.Bạn cũng có thể tạo các lớp trong suốt và dính JPanel vào bất cứ thứ gì bạn muốn. Nếu bạn chỉ muốn hiển thị một phần trên nhãn dễ dàng. Nếu bạn có một số loại xử lý văn bản trong tâm trí đó là khó khăn.

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

* "Hãy cho tôi 50 !!!" * Tiền thưởng có thể được trao một lần, toàn bộ. Nó là tất cả hoặc không là gì cả'. Nhưng tôi sẽ quăng bạn 10.;) –

+0

@Andrew Thompson :-) tại sao không, tôi đã đưa ra 250, trò đùa hay, không phải là nó là – mKorbel

+0

@Glen P không phải là hàng rào này xứng đáng với số tiền thưởng của tôi trong số 250 – mKorbel

5

Bạn có thể sử dụng cách tiếp cận dựa trên http://java-sl.com/fraction_view.html

Sự khác biệt duy này được định vị subviews cho tử số và mẫu số.

+0

+1 cảm ơn bạn đã nhập, vui lòng xem chỉnh sửa của tôi – mKorbel

2

phông chữ đặc biệt phương pháp:

Phương pháp phông chữ đặc biệt có thể là một giải pháp thực sự tốt quá.

Bạn sẽ cần trình chỉnh sửa phông chữ tốt.

Tạo mười số chỉ cho số đầu của phân số, một dấu gạch chéo đặc biệt hoặc biểu tượng đường kẻ ở giữa và mười số chỉ dành cho các chữ số dưới cùng.

Vấn đề duy nhất là nó phải trông tốt và yêu cầu khoảng cách của đầu/dấu gạch chéo/và nút gần nhau, thực sự chồng chéo theo chiều ngang. Tin tốt lành là phông chữ hỗ trợ điều này, và một trình soạn thảo phông chữ tốt sẽ. Các thành phần văn bản xoay có lẽ không. Bạn cần phải viết thành phần văn bản của riêng bạn tìm thấy một thành phần đã cho phép bạn vị trí tốt của phông chữ. Đây là sự khác biệt giữa việc chỉnh sửa kiểm tra/xử lý văn bản và kiểu chữ văn bản.

Nhưng tôi cũng có ý tưởng khác :)

Bạn có thể thực hiện phân số bằng thanh ngang thay vì gạch chéo.

123 
--- 
456 

Phông chữ này không cần chồng chéo và có thể được trình bày bởi trình chỉnh sửa theo cách tiêu chuẩn. Bí quyết là phải có ba ký tự bên cạnh nhau.

1 2 3 
- - - 
4 5 6 

Vì vậy, đó là một trăm ký tự khác nhau bạn cần cho tất cả các kết hợp.

Vấn đề duy nhất với điều này (ngoài phải tạo 100 ký tự) là nếu bạn có và số lẻ của các chữ số ở đầu trang và thậm chí ở dưới cùng hoặc vise câu nó sẽ giống như thế này:

12 
--- 
456 
4

Unicode có một bộ ký tự cho phép bạn tạo các phân số mà không cần phải định dạng đặc biệt, ví dụ: ⁴⁄₉ hoặc ⁵⁶⁄₁₀₀.

Bạn có thể thiết lập một dãy các chữ số phụ, và một dãy các chữ số chỉ số, và chuyển đổi các số của bạn thành chuỗi các chữ số này, sau đó kết hợp chúng với dấu gạch chéo ở giữa.

Ưu điểm là tổng quát hơn (bạn có thể sử dụng mã trong các ngữ cảnh khác) và kết quả sẽ trông đẹp hơn nếu bạn cố gắng tạo lại nó bằng định dạng HTML. Tất nhiên, bạn cần phải có phông chữ Unicode trên hệ thống của bạn, nhưng hầu hết các hệ thống làm những ngày này.

Một thực thể trong mã:

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

Xem thêm [Superscripts and Subscripts] (http://www.unicode.org/charts/PDF/U2070.pdf). – trashgod

Các vấn đề liên quan