Java swing lỗi font tiếng việt khi insert năm 2024
Vẽ kí tự lên màn hình là một chủ đề phức tạp, có khi viết nguyên một quyển sách cũng chưa hết, nên trong bài này mình chỉ bàn về một số thao tác cơ bản. Có hai loại font là font vật lý (Physical Font) và font logic (Logical Font). Font vật lý là font thật, được lưu trong hệ điều hành, font logic không phải font thật mà thực ra chỉ là 5 hệ font được định nghĩa bởi Java: Serif, SansSerif, Monospaced, Dialog, DialogInput. Khi được gọi thì font logic sẽ được Java map vào font vật lý. Một Font là một tập hợp các ký tự, một kí tự được gọi là TypeFace, tập hợp các TypeFace giống nhau nhưng khác kiểu font (hoặc các tính chất khác như độ lớn, độ nghiêng…) được gọi là Font-Family. Font trong hệ điều hànhĐoạn code dưới đây sẽ in ra toàn bộ font chữ hiện được hỗ trợ bởi hệ điều hành của bạn. AllFontsEx.java import java.awt.Font; import java.awt.GraphicsEnvironment; public class AllFontsEx { }
Bản thân Java không chứa thông tin về các kiểu font trong hệ điều hành, Java chỉ lấy thông tin về font của hệ điều hành để sử dụng. Mỗi hệ điều hành có bộ font khác nhau. Để lấy thông tin về font chữ trong hệ điều hành thì chúng ta sử dụng các lớp System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 5, System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 6. Font[] fonts = ge.getAllFonts(); Phương thức System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 7 trả về danh sách font hiện có trong System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 5. System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); Chúng ta dùng phương thức System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 9 và ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 0để lấy về tên font và tên family. ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... In text lên màn hìnhTrong ví dụ dưới đây, chúng ta sẽ in một đoạn lyric lên panel. import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
Để thiết lập kiểu font mong muốn thì chúng ta dùng phương thức ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 1. g2d.setFont(new Font("NewellsHand", Font.PLAIN, 18)); Để in một đoạn text thì chúng ta dùng phương thức ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 2. g2d.drawString("Most relationships seem so transitory", 20, 30); Tạo hiệu dứng đổ bóng cho chữimport java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.TextLayout; import java.awt.image.BufferedImage; import java.awt.image.ConvolveOp; import java.awt.image.Kernel; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; public class ShadowedTextEx extends JFrame { }
Để tạo bóng cho một đoạn text thì chúng ta vẽ hai đoạn text, một đoạn text chính và một đoạn text dùng làm bóng, trong đó đoạn text đổ bóng được làm mờ, có vị trí lệch một ít với đoạn text gốc.textLayout = new TextLayout(text, font, g1d.getFontRenderContext()); Chúng ta dùng lớp ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 3 để quy định các tính chất cho đoạn text, lớp này cho phép chúng ta thao tác sâu hơn với font. textLayout.draw(g1d, x+3, y+3); Chúng ta vẽ đoạn text lên màn hình có vị trí lệch 3 pixel so với đoạn text gốc. Font[] fonts = ge.getAllFonts(); 0 Để tăng thêm hiệu ứng thì chúng ta áp dụng hiệu ứng mờ lên đoạn text. Font[] fonts = ge.getAllFonts(); 1 Chúng ta áp dụng hiệu ứng mờ lên đoạn text gốc rồi gán vào đoạn text thứ hai dùng làm đổ bóng. Font[] fonts = ge.getAllFonts(); 2 Sau đó chúng ta vẽ đoạn text gốc để đảm bảo đoạn text gốc nằm đè lên đoạn text đổ bóng. Một số tính chất khácFont[] fonts = ge.getAllFonts(); 3 Để thay đổi các tính chất của text thì chúng ta dùng các lớp System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 6, ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 5 và ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 6. Lớp System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 6 quy định kiểu font, lớp ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 5 quy định một số tính chất như màu chữ, màu nền… còn lớp ... .VnArial : .VnArial .VnArial Bold : .VnArial .VnArial Bold Italic : .VnArial .VnArial Italic : .VnArial .VnArial Narrow : .VnArial Narrow .VnArial Narrow Bold : .VnArial Narrow .VnArial Narrow Italic : .VnArial Narrow .VnArial NarrowH : .VnArial NarrowH .VnArialH : .VnArialH .VnArialH Bold Italic : .VnArialH ... 9 lưu thông tin về đoạn text và các tính chất của nó. Font[] fonts = ge.getAllFonts(); 4 Đầu tiên chúng ta tạo một đối tượng import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
0Font[] fonts = ge.getAllFonts(); 5 Chúng ta có thể thêm một số tính chất khác vào đoạn text thông qua phương thức import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
1import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
2, dòng trên có ý nghĩa là thiết lập màu chữ của các kí tự từ vị trí 0 đến vị trí 6 có màu đỏ.Font[] fonts = ge.getAllFonts(); 6 Sau khi đã định nghĩa các tính chất mong muốn, chúng ta vẽ đoạn text lên nhưng chúng ta sẽ lấy đoạn text đó từ phương thức import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
3chứ không dùng đoạn string gốc. Xoay chữTrong bài xử lý ảnh chúng ta đã học cách xoay các đối tượng hình học. Bản thân các ký tự được vẽ trong Java cũng là các đối tượng hình học, chúng ta sẽ lấy các đối tượng đó ra mà xoay rồi vẽ như vẽ một đối tượng hình học bình thường. Font[] fonts = ge.getAllFonts(); 7 Chúng ta sẽ dùng lớp import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
4 và lớp import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
5lớp import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
4 chứa các thông tin cần thiết để lấy kích thước của kí tự, lớp import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
7 lưu thông tin về các đặc điểm hình học của kí tự.Font[] fonts = ge.getAllFonts(); 8 Đầu tiên chúng ta tạo một đối tượng import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
7, trong đó lưu những thông tin về hình ảnh, vị trí…Font[] fonts = ge.getAllFonts(); 9 Mỗi kí tự trong đoạn text sẽ được lưu trong một đối tượng hình học riêng, nên chúng ta lấy về số lượng các kí tự (cũng như các đối tượng hình học). System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 0 Sau đó chúng ta lặp qua từng kí tự, tại mỗi lần lặp chúng ta lấy ra tọa độ của đối tượng vẽ ra kí tự đó bằng phương thức import java.awt.EventQueue; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import javax.swing.JFrame; import javax.swing.JPanel; class Surface extends JPanel { }
public class SoulmateEx extends JFrame { }
9System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 1 Tiếp theo chúng ta tính góc xoay cho đối tượng đó dựa vào thứ tự của nó trong chuỗi. System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 2 Tiếp theo chúng ta xoay bằng cách sử dụng lớp g2d.setFont(new Font("NewellsHand", Font.PLAIN, 18)); 0. System.out.print(fonts[i].getFontName() + " : "); System.out.println(fonts[i].getFamily()); 3 Cuối cùng chúng ta dùng phương thức getGlyphOutline() để lấy về đối tượng hình học của kí tự hiện tại rồi dùng phương thức g2d.setFont(new Font("NewellsHand", Font.PLAIN, 18)); 1để tạo ra đối tượng đó ở trạng thái đã xoay. |