如何在Java Swing构建的UI应用中设置字符串/文本颜色
Java Swing 非HTML实现文本着色可行方案
方案1:单颜色文本最简实现(优先选用)
如果需求是给整段展示文本设置统一颜色,不需要同一段内多色混排,直接调用Swing文本组件自带的setForeground()方法即可,覆盖JLabel、JButton、JTextField、JCheckBox等绝大多数自带文本展示的组件,性能最高、代码量最小:
// 示例:给标签设置红色文本 JLabel textLabel = new JLabel("This is my simple text"); textLabel.setForeground(Color.RED);
方案2:通用多色/多样式文本实现(适配绝大多数场景)
如果需要同一段文本内不同部分显示不同颜色、不同字体样式(比如部分字红色、部分字蓝色,混排加粗/斜体),使用JTextPane搭配StyledDocument实现,是Swing原生提供的富文本展示方案,完全不依赖HTML解析,支持细粒度样式控制,通用度远高于JTree/JTable这类特定组件的渲染器方案:
import javax.swing.*; import javax.swing.text.*; import java.awt.*; public class ColorTextDemo { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { JFrame frame = new JFrame("彩色文本展示"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 初始化文本展示组件,设为不可编辑作为纯展示用 JTextPane textPane = new JTextPane(); textPane.setEditable(false); textPane.setOpaque(false); // 不需要背景的话设为透明,和JLabel视觉效果一致 StyledDocument doc = textPane.getStyledDocument(); // 定义红色文本样式,可同时设置字号、字体、加粗等属性 SimpleAttributeSet redTextAttr = new SimpleAttributeSet(); StyleConstants.setForeground(redTextAttr, Color.RED); StyleConstants.setFontSize(redTextAttr, 14); try { // 插入带样式的文本,可多次插入不同样式的文本实现混排 doc.insertString(0, "This is my simple text", redTextAttr); } catch (BadLocationException e) { e.printStackTrace(); } frame.add(textPane); frame.setSize(300, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); }); } }
方案3:自定义绘制场景实现
如果是在自绘组件上展示彩色文本,直接在paintComponent方法中通过Graphics对象设置颜色后绘制文本即可,自由度最高:
@Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 设置文本颜色 g.setColor(Color.RED); g.setFont(getFont()); // 指定坐标绘制文本 g.drawString("This is my simple text", 10, 20); }
方案选型参考
- 整段单色展示:优先选方案1,代码最简单性能最好
- 多色/多样式混排、通用文本展示:选方案2,原生支持无额外依赖
- 完全自定义UI绘制场景:选方案3,可控性最高
内容的提问来源于stack exchange,提问作者Aditi Sharma
相关产品推荐
相关产品推荐

