[JAVA] java仿windows 字体设置选项卡

时间:2022-02-04 06:28:06

想用java做一个像windows里一样的txt编辑软件,涉及到字体设置选项卡,在网上找了很久都没找到,就生气啦自己写一个,现在贴这里分享一下,下次再遇到这样的问题就不用自己亲自打代码啦!
[JAVA] java仿windows 字体设置选项卡

  1 package 实验;
  2 
  3 import java.awt.*;
  4 import java.awt.event.ActionEvent;
  5 import java.awt.event.ActionListener;
  6 import java.awt.event.MouseAdapter;
  7 import java.awt.event.MouseEvent;
  8 
  9 import javax.swing.*;
 10 import javax.swing.border.BevelBorder;
 11 
 12 /**
 13  * 字体格式设置对话框
 14  */
 15 
 16 public class FontFormat extends JDialog {
 17 
 18     private JLabel nameLb;
 19     private JLabel styleLb;
 20     private JLabel sizeLb;
 21     private JLabel presLb;
 22     private JTextField nameTx;
 23     private JTextField styleTx;
 24     private JTextField sizeTx;
 25     private JTextField presTx;
 26     private JList nameLt;
 27     private JList styleLt;
 28     private JList sizeLt;
 29     private JScrollPane jScrollPane1;
 30     private JScrollPane jScrollPane2;
 31     private JScrollPane jScrollPane3;
 32     private JButton approve;
 33     private JButton cancel;
 34     private JButton chose;
 35     private JRadioButton[] language = new JRadioButton[2];
 36     private ButtonGroup languageg;
 37     private String Slanguage[] = { new String("李涛"), new String("ABC") };
 38 
 39     private static JFrame frame;
 40     public Font font, newFont;// 字体类
 41     private Color color;// 颜色类
 42     Color newColor;
 43 
 44     private JFileChooser fileChoose = new JFileChooser();// 文件选择类实例
 45     private JDialog colorDlg;// 颜色对话框
 46     private JColorChooser colorChoose = new JColorChooser();// 颜色选择类实例
 47 
 48     private GraphicsEnvironment environment; // 该类中又获取系统字体的方法;
 49     private String[] fontNameSet;// 字体‘逻辑名’集
 50     // 字体‘样式’集的字符串数组
 51     private String[] fontStyleSet = { "常规", "倾斜", "加粗", "倾斜 加粗" };
 52     // 字体‘样式’集的常量数组
 53     private Integer[] fontCon = { Font.PLAIN, Font.ITALIC, Font.BOLD,
 54             Font.BOLD | Font.ITALIC };
 55     // 字体‘大小’集
 56     private String[] fontSizeSet = { "6", "7", "8", "9", "10", "11", "12",
 57             "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72" };
 58 
 59     public static void main(String args[]) {// 主函数
 60         FontFormat a = new FontFormat();
 61         a.setVisible(true);
 62     }
 63 
 64     public FontFormat() {// 无参构造函数
 65         super(frame, "李涛—字体设置窗口", true);
 66         frame = new JFrame();
 67         initGUI();
 68     }
 69 
 70     public FontFormat(JFrame frame) {// 含参构造函数
 71         super(frame, "李涛—字体设置窗口", true);
 72         this.frame = frame;// 父窗口中必须有一个public的Font对象
 73         // setAlwaysOnTop(true);
 74         initGUI();
 75     }
 76 
 77     private void initGUI() {// 字体格式选择器的界面初始化
 78         try {
 79             getContentPane().setLayout(null);
 80             environment = GraphicsEnvironment.getLocalGraphicsEnvironment();// GraphicsEnvironment是一个抽象类,不能实例化,只能用其中的静态方法获取一个实例
 81             fontNameSet = environment.getAvailableFontFamilyNames();// 获取系统字体
 82             addMenu();// 加入菜单
 83             initFont();// 初始化字体
 84             // pack();
 85             setSize(380, 337);
 86             setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
 87             setWindowPos();// 使窗口屏幕居中
 88             setResizable(false);// 大小不可变
 89         } catch (Exception e) {
 90             e.printStackTrace();
 91         }
 92     }
 93 
 94     private void initFont() {// 初始化字体
 95         // 设置默认字体格式为父窗口font对向的字体格式
 96         if (frame.getFont() == null) {
 97             nameTx.setText(fontNameSet[0]);
 98             styleTx.setText(fontStyleSet[0]);
 99             sizeTx.setText("12");
100             nameLt.setSelectedValue(fontNameSet[0], true);
101             styleLt.setSelectedIndex(0);
102             sizeLt.setSelectedValue("12", true);
103             font = new Font(fontNameSet[0], fontCon[0], 12);
104             newFont = font;// 保存原来的字体格式
105             presTx.setFont(font);
106             // JOptionPane.showMessageDialog(null, "ccac");
107         } else {
108             int idxStyle = 0;
109             for (int i = 0; i < fontCon.length; i++) {
110                 if (fontCon[i] == frame.getFont().getStyle())
111                     idxStyle = i;
112             }
113             nameTx.setText(frame.getFont().getName());// 改text
114             styleTx.setText(fontStyleSet[idxStyle]);
115             sizeTx.setText("" + frame.getFont().getSize());
116             nameLt.setSelectedValue(frame.getFont().getName(), true);// 改list显示
117             styleLt.setSelectedIndex(idxStyle);
118             sizeLt.setSelectedValue("" + frame.getFont().getSize(), true);
119             font = new Font(fontNameSet[0], fontCon[0], 12);// 保存当前格式
120             newFont = font;// 保存原来的字体格式
121             presTx.setFont(font);// 预览中设为当前模式
122         }
123     }
124 
125     private void addMenu() {// 加入菜单
126         // 4个lable---------------------------------------------------------------------------------
127         nameLb = new JLabel();
128         getContentPane().add(nameLb);
129         nameLb.setText("字体:");
130         nameLb.setBounds(10, 14, 120, 26);
131         nameLb.setFont(new java.awt.Font("SimSun", 1, 14));
132 
133         styleLb = new JLabel();
134         getContentPane().add(styleLb);
135         styleLb.setText("字型:");
136         styleLb.setBounds(151, 14, 120, 23);
137         styleLb.setFont(new java.awt.Font("SimSun", 1, 14));
138 
139         sizeLb = new JLabel();
140         getContentPane().add(sizeLb);
141         sizeLb.setText("大小:");
142         sizeLb.setBounds(275, 14, 79, 24);
143         sizeLb.setFont(new java.awt.Font("SimSun", 1, 14));
144 
145         presLb = new JLabel();
146         getContentPane().add(presLb);
147         presLb.setText("预览:");
148         presLb.setBounds(151, 150, 120, 80);
149         presLb.setFont(new java.awt.Font("SimSun", 1, 14));
150 
151         // 4个textfield---------------------------------------------------------------------------------
152         nameTx = new JTextField();
153         nameTx.setEditable(false);
154         getContentPane().add(nameTx);
155         nameTx.setBounds(10, 42, 120, 22);
156 
157         styleTx = new JTextField();
158         styleTx.setEditable(false);
159         getContentPane().add(styleTx);
160         styleTx.setBounds(151, 42, 100, 21);
161 
162         sizeTx = new JTextField();
163         sizeTx.setEditable(false);
164         getContentPane().add(sizeTx);
165         sizeTx.setBounds(275, 42, 79, 22);
166 
167         presTx = new JTextField();
168         presTx.setEditable(false);
169         getContentPane().add(presTx);
170         presTx.setBounds(151, 200, 203, 61);
171         presTx.setText(Slanguage[1]);
172 
173         // 3个下拉条--+监听-----------------------------------------------------------------------------
174         jScrollPane1 = new JScrollPane();
175         getContentPane().add(jScrollPane1);
176         jScrollPane1.setBounds(10, 74, 120, 210);
177         {
178             ListModel fontNameModel = new DefaultComboBoxModel(fontNameSet);
179             nameLt = new JList();
180             jScrollPane1.setViewportView(nameLt);
181             nameLt.setModel(fontNameModel);
182             nameLt.setBounds(274, 193, 90, 86);
183             nameLt.setBorder(BorderFactory
184                     .createEtchedBorder(BevelBorder.LOWERED));
185             nameLt.addMouseListener(new MouseAdapter() {
186                 public void mouseClicked(MouseEvent evt) {
187                     nameLtMouseClicked(evt);
188                 }
189             });
190         }
191 
192         jScrollPane2 = new JScrollPane();
193         getContentPane().add(jScrollPane2);
194         jScrollPane2.setBounds(151, 74, 100, 103);
195         {
196             ListModel fontStyleModel = new DefaultComboBoxModel(fontStyleSet);
197             styleLt = new JList();
198             jScrollPane2.setViewportView(styleLt);
199             styleLt.setModel(fontStyleModel);
200             styleLt.setBounds(310, 215, 70, 102);
201             styleLt.setBorder(BorderFactory
202                     .createEtchedBorder(BevelBorder.LOWERED));
203             styleLt.addMouseListener(new MouseAdapter() {
204                 public void mouseClicked(MouseEvent evt) {
205                     styleLtMouseClicked(evt);
206                 }
207             });
208         }
209 
210         jScrollPane3 = new JScrollPane();
211         getContentPane().add(jScrollPane3);
212         jScrollPane3.setBounds(275, 75, 79, 100);
213         {
214             ListModel fontSizeModel = new DefaultComboBoxModel(fontSizeSet);
215             sizeLt = new JList();
216             jScrollPane3.setViewportView(sizeLt);
217             sizeLt.setModel(fontSizeModel);
218             sizeLt.setBounds(300, 218, 54, 102);
219             sizeLt.setBorder(BorderFactory
220                     .createEtchedBorder(BevelBorder.LOWERED));
221             sizeLt.addMouseListener(new MouseAdapter() {
222                 public void mouseClicked(MouseEvent evt) {
223                     sizeLtMouseClicked(evt);
224                 }
225             });
226         }// -------------------------------------------------------------------------------------
227 
228         // 中英选项(---------------------------------------------------------------------------------
229         languageg = new ButtonGroup();
230         language[0] = new JRadioButton("中");
231         getContentPane().add(language[0]);
232         language[0].setSelected(false);// 初始化显示
233         language[0].setBounds(271, 179, 40, 20);
234         language[0].setFont(new java.awt.Font("SimSun", 1, 12));
235         languageg.add(language[0]);
236         language[0].addActionListener(new ActionListener() {
237             public void actionPerformed(ActionEvent evt) {
238                 presTx.setText(Slanguage[0]);
239             }
240         });
241 
242         language[1] = new JRadioButton("英");
243         getContentPane().add(language[1]);
244         language[1].setSelected(true);
245         language[1].setBounds(321, 179, 40, 20);
246         language[1].setFont(new java.awt.Font("SimSun", 1, 12));
247         languageg.add(language[1]);
248         language[1].addActionListener(new ActionListener() {
249             public void actionPerformed(ActionEvent evt) {
250                 presTx.setText(Slanguage[1]);
251             }
252         });
253 
254         // 3个按钮+监听---------------------------------------------------------------------------------
255         // 确定按钮
256         approve = new JButton();
257         getContentPane().add(approve);
258         approve.setText("确定");
259         approve.setBounds(151, 265, 67, 20);
260         approve.setFont(new java.awt.Font("KaiTi_GB2312", 1, 12));
261         approve.addActionListener(new ActionListener() {
262             public void actionPerformed(ActionEvent evt) {
263                 approveActionPerformed(evt);
264             }
265         });
266 
267         // 取消按钮
268         cancel = new JButton();
269         getContentPane().add(cancel);
270         cancel.setText("取消");
271         cancel.setBounds(219, 265, 67, 20);
272         cancel.setFont(new java.awt.Font("KaiTi_GB2312", 1, 12));
273         cancel.addActionListener(new ActionListener() {
274             public void actionPerformed(ActionEvent evt) {
275                 cancelActionPerformed(evt);
276             }
277         });
278 
279         // 颜色选择按钮
280         chose = new JButton();
281         getContentPane().add(chose);
282         chose.setText("颜色");
283         chose.setBounds(287, 265, 67, 20);
284         chose.setFont(new java.awt.Font("KaiTi_GB2312", 1, 12));
285         chose.addActionListener(new ActionListener() {
286             public void actionPerformed(ActionEvent evt) {
287                 choseActionPerformed(evt);
288             }
289         });// -------------------------------------------------------------------------
290     }
291 
292     private void setWindowPos() {// 窗口居中
293         Toolkit kit = Toolkit.getDefaultToolkit();// 抽象类,通过静态方法获取实例
294         Dimension frameSize = new Dimension(), screenSize = kit.getScreenSize(); // 获取屏幕的大小
295         getSize(frameSize); // 获取窗口大小
296         setLocation((screenSize.width - frameSize.width) / 2,
297                 (screenSize.height - frameSize.height) / 2);
298     }
299 
300     private void nameLtMouseClicked(MouseEvent evt) {// 字体逻辑名列表的鼠标单击事件
301         nameTx.setText(nameLt.getSelectedValue().toString());
302         font = new Font(nameTx.getText(), font.getStyle(), font.getSize());
303         presTx.setFont(font);
304     }
305 
306     private void styleLtMouseClicked(MouseEvent evt) {// 字体样式列表的鼠标单击事件
307         String temp = styleLt.getSelectedValue().toString();
308         styleTx.setText(temp);
309         int index = 0;
310         while (index < 4 && !fontStyleSet[index].equals(temp)) {
311             index++;
312         }
313         font = new Font(font.getName(), fontCon[index], font.getSize());
314         presTx.setFont(font);
315     }
316 
317     private void sizeLtMouseClicked(MouseEvent evt) {// 字体大小列表的鼠标点击事件
318         sizeTx.setText(sizeLt.getSelectedValue().toString());
319         font = new Font(font.getName(), font.getStyle(),
320                 Integer.parseInt(sizeTx.getText()));
321         presTx.setFont(font);
322     }
323 
324     private void approveActionPerformed(ActionEvent evt) {// 确定按钮的触发事件
325         String name = nameTx.getText();
326         int style = fontCon[styleLt.getSelectedIndex()];
327         int size = Integer.parseInt(sizeTx.getText());
328         font = new Font(name, style, size);
329         frame.setFont(font); // 父窗口的Font对象
330         newFont = font;// 更新原来保存格式
331         newColor = color;// 更新颜色
332         this.dispose();
333     }
334 
335     private void cancelActionPerformed(ActionEvent evt) {// 取消按钮的触发事件
336         this.dispose();
337     }
338 
339     private void choseActionPerformed(ActionEvent evt) {// 颜色选择触发事件
340         if (colorDlg == null) {
341             colorDlg = JColorChooser.createDialog(FontFormat.this,
342                     "Select Text Color", true, colorChoose,
343                     new ColorOKListener(), null);
344         }
345         colorChoose.setColor(color = presTx.getForeground());
346         colorDlg.setVisible(true);
347     }
348 
349     class ColorOKListener implements ActionListener {// 重写颜色按钮点击监听类覆盖接口ActionListener
350         public void actionPerformed(ActionEvent e) {
351             Color c = colorChoose.getColor();
352             color = c;
353             presTx.setForeground(c);
354             presTx.repaint();
355         }
356     }
357 }