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