Akira  Noguchi Akira Noguchi - 3 months ago 24
Java Question

How to change font color in JFrame

I want to change font color when I pressed button.

Font color is selected by 3 radiobuttons.

When I pressed button, then makeStyleSheet function makes a css.

In this css, only one color defined.

But font color doesn't changed....

Why ???

@SuppressWarnings("javadoc")
public class Sample extends JFrame {

JRadioButton[] radio;
JTextPane textPane;
HTMLEditorKit kit;
HTMLDocument doc;
JButton btnNewButton;
ButtonGroup group;
List<JRadioButton> list;

/**
* @param args
*/
public static void main(String[] args) {
Sample frame = new Sample();
ActionListener action = new MyButtonAction(frame.kit, frame.doc, frame.list);

frame.addAction(action);
frame.setVisible(true);
}

private void addAction(ActionListener action) {

btnNewButton.addActionListener(action);
}

@SuppressWarnings("javadoc")
public Sample() {

doc = new HTMLDocument();
textPane = new JTextPane();
kit = new HTMLEditorKit();

setBounds(100, 100, 450, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(null);

textPane.setEditorKit(kit);
textPane.setDocument(doc);
textPane.setContentType("text/html");
textPane.setBounds(12, 13, 282, 229);
getContentPane().add(textPane);

btnNewButton = new JButton("HTML");
btnNewButton.setBounds(303, 211, 117, 31);

getContentPane().add(btnNewButton);

group = new ButtonGroup();

list = new ArrayList<JRadioButton>();

JRadioButton rdbtnRed = new JRadioButton("apple", true);
JRadioButton rdbtnYellow = new JRadioButton("banana");
JRadioButton rdbtnGreen = new JRadioButton("mellon");

list.add(rdbtnRed);
list.add(rdbtnYellow);
list.add(rdbtnGreen);

group.add(rdbtnRed);
group.add(rdbtnYellow);
group.add(rdbtnGreen);

rdbtnRed.setBounds(302, 161, 113, 21);
getContentPane().add(rdbtnRed);
rdbtnYellow.setBounds(302, 138, 113, 21);
getContentPane().add(rdbtnYellow);
rdbtnGreen.setBounds(302, 115, 113, 21);
getContentPane().add(rdbtnGreen);
}
}

class MyButtonAction implements ActionListener {

HTMLEditorKit kit;
HTMLDocument doc;
List<JRadioButton> list;

public MyButtonAction(HTMLEditorKit kit, HTMLDocument doc, List<JRadioButton> list) {

this.kit = kit;
this.doc = doc;
this.list = list;
}

@Override
public void actionPerformed(ActionEvent e) {

String tag = null;

for(JRadioButton btn : list) {

if (btn.isSelected()){

tag = btn.getText();
}
}

kit.setStyleSheet(makeStyleSheet(tag));

try {

kit.insertHTML(doc, doc.getLength(), "<font class=\"apple\">apple</font>,<font class=\"banana\">banana</font>,<font class=\"mellon\">mellon</font>", 0, 0, null);
} catch (IOException e1) {

e1.printStackTrace();
} catch (BadLocationException e1) {

e1.printStackTrace();
}
}

private StyleSheet makeStyleSheet(String tag) {

StyleSheet styleSheet = new StyleSheet();
styleSheet.addRule("." + tag + " {color: red;}");

return styleSheet;
}
}

Answer

Add the CSS rules to the stylesheet of the doc, not kit.

    doc.getStyleSheet().addRule(".apple {color: red;}");
    doc.getStyleSheet().addRule(".banana {color: yellow;}");
    doc.getStyleSheet().addRule(".mellon {color: green;}");

By the way: more regular is to use a <span> i.o. a <font>.