JAVA Swing 设置字体属性,模仿word


运行效果

代码

import javax.swing.*;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.Map;

public class demo2 extends JFrame {
    JTextPane text = new JTextPane();

    DefaultStyledDocument doc = (DefaultStyledDocument)text.getDocument(); //从文字面板建立默认样式化文档
    SimpleAttributeSet set = new SimpleAttributeSet(); //建立一个样式属性集合

    JComboBox fonts,sizes,colors;
    JButton ensure,cancel;
    String[] font ={"宋体","黑体","楷体","仿宋"};
    String[] size ={"10号","12号","14号","16号"};
    String[] color = {"黑色","红色","绿色","蓝色"};

    int start=0;
    int end=0;

    public demo2(){
        super();
        this.setLayout(new GridLayout(1,2)); //网格布局,一行二列
        text.setText("这是一行文本,你可以使用右边的选项来改变s字体的样式");
        text.setFont(new Font(font[0],Font.PLAIN,10));//设置默认为宋体10号
        this.add(text);



        JPanel panel = new JPanel(new GridLayout(5,2));
        panel.add(new JLabel("字体设置"));
        panel.add(new JLabel());
        panel.add(new JLabel("字体:"));
        panel.add(fonts=new JComboBox(font));
        panel.add(new JLabel("字号:"));
        panel.add(sizes=new JComboBox(size));
        panel.add(new JLabel("颜色:"));
        panel.add(colors=new JComboBox(color));
        panel.add(ensure=new JButton("确定"));
        panel.add(cancel=new JButton("取消"));
        this.add(panel);
        //添加监听
        Action action = new Action();
        fonts.addActionListener(action);
        sizes.addActionListener(action);
        colors.addActionListener(action);
        ensure.addActionListener(action);
        cancel.addActionListener(action);
        //文本面板添加鼠标监听,用于获取选中的文字
        Mouse mouse = new Mouse();
        text.addMouseListener(mouse);

        this.setSize(350,150);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    class Action implements ActionListener{
        //建立映射
        int[] sizeen = {10,12,14,16};
        Color[] coloren = {Color.BLACK,Color.RED,Color.GREEN,Color.BLUE};
        Map<String,Integer> sizeMap = new HashMap<>();
        Map<String,Color> colorMap = new HashMap<>();



        @Override
        public void actionPerformed(ActionEvent e) {
            for (int i = 0; i < 4; i++) {
                sizeMap.put(size[i],sizeen[i]);
                colorMap.put(color[i],coloren[i]);
            }
            Object source = e.getSource();
            String f = (String)fonts.getSelectedItem();
            String s = (String)sizes.getSelectedItem();
            String c = (String)colors.getSelectedItem();

            set.addAttribute(StyleConstants.FontFamily,f); //设置选择的字体
            set.addAttribute(StyleConstants.Size,sizeMap.get(s)); //设置选择的字号
            set.addAttribute(StyleConstants.Foreground,colorMap.get(c)); //设置选择的颜色
            //点击确定按钮
            if (source.equals(ensure)){
                doc.setCharacterAttributes(0,text.getText().length(),set,false); //所有文本更改为所选样式
            }else if (source.equals(cancel)){ //点击取消按钮
                //样式回归默认
                set.addAttribute(StyleConstants.FontFamily,font[0]);
                set.addAttribute(StyleConstants.FontSize,sizeen[0]);
                set.addAttribute(StyleConstants.Foreground,coloren[0]);
                doc.setCharacterAttributes(0,text.getText().length(),set,false); //所有文本改为默认样式
                //列表框选项归位
                fonts.setSelectedItem(font[0]);
                sizes.setSelectedItem(size[0]);
                colors.setSelectedItem(color[0]);
            }else if (source.equals(fonts)|source.equals(sizes)|source.equals(colors)){ //如果选择了文本,更改列表框选项时会即时修改样式
                doc.setCharacterAttributes(start,end,set,false); //即时修改选择的文本为指定样式
            }
        }

    }

    class Mouse implements MouseListener{
        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {
            //获取选择的文本的开始坐标和长度
            start=text.getSelectionStart();
            end=text.getSelectionEnd()-start;
        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    }

    public static void main(String[] args) {
        new demo2();
    }
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM