Re: Question about Sun's TextSamplerDemo in tutorial
"fiziwig" <fiziwig@yahoo.com> wrote in message
news:1154626490.188775.208860@p79g2000cwp.googlegroups.com...
I've stripped the code of the standard TextSampleDemo.java down to the
bare minimum to demonstrate the problem I'm trying to solve. I want a
button in the toolbar that will turn the selected text in the text pane
to bold when it is clicked. I've been beating my head against this
problem for a couple of days now with no luck.
Any help would be deeply appreciated.
--gary
Here's the code of the stripped down demo with the desired toolbar
button added:
I made changes in the program outside of your "???" section, so read the
whole thing carefully.
<SSCCE>
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.JToolBar;
import javax.swing.text.BadLocationException;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
import javax.swing.text.StyledDocument;
public class TextSamplerDemo extends JPanel {
private String newline = System.getProperty("line.separator");
private JTextPane textPane;
public TextSamplerDemo() {
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
JToolBar toolBar = buildToolbar();
add(toolBar);
// Create a text pane.
textPane = createTextPane();
JScrollPane paneScrollPane = new JScrollPane(textPane);
paneScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
paneScrollPane.setPreferredSize(new Dimension(250, 155));
paneScrollPane.setMinimumSize(new Dimension(10, 10));
add(paneScrollPane);
}
private JTextPane createTextPane() {
String[] initString = {
"This is an editable JTextPane, ",
// regular
"another ",
// italic
"styled ", // bold
"text ", // small
"component, " + newline,
// large
"which supports embedded components..." + newline,// regular
newline + "JTextPane is a subclass of JEditorPane that " + newline
+ "uses a StyledEditorKit and StyledDocument, and provides " + newline
+ "cover methods for interacting with those objects." };
String[] initStyles = { "regular", "italic", "bold", "small", "large",
"regular", "regular" };
JTextPane textPane = new JTextPane();
StyledDocument doc = textPane.getStyledDocument();
addStylesToDocument(doc);
try {
for (int i = 0; i < initString.length; i++) {
doc.insertString(doc.getLength(), initString[i],
doc.getStyle(initStyles[i]));
}
}
catch (BadLocationException ble) {
System.err.println("Couldn't insert initial text into text pane.");
}
return textPane;
}
protected void addStylesToDocument(StyledDocument doc) {
// Initialize some styles.
Style def =
StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
Style regular = doc.addStyle("regular", def);
StyleConstants.setFontFamily(def, "SansSerif");
Style s = doc.addStyle("italic", regular);
StyleConstants.setItalic(s, true);
s = doc.addStyle("bold", regular);
StyleConstants.setBold(s, true);
s = doc.addStyle("small", regular);
StyleConstants.setFontSize(s, 10);
s = doc.addStyle("large", regular);
StyleConstants.setFontSize(s, 16);
}
private JToolBar buildToolbar() {
JToolBar toolBar = new JToolBar();
toolBar.setRollover(true);
toolBar.setFloatable(false);
JButton boldButton = new JButton("Bold");
boldButton.setToolTipText("Set selected text to bold");
boldButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
StyledDocument doc = textPane.getStyledDocument();
int offset = textPane.getSelectionStart();
int length = textPane.getSelectionEnd() - offset;
MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setBold(attr, true);
doc.setCharacterAttributes(offset, length, attr, false);
}
});
toolBar.add(boldButton);
return toolBar;
}
/**
* Create the GUI and show it. For thread safety, this method should be
invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Make sure we have nice window decorations.
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("TextSamplerDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
JComponent newContentPane = new TextSamplerDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
</SSCCE>
- Oliver