運行效果

代碼
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();
}
}