我有这个代码将所选文本以粗体显示,并且工作正常,但我如何删除样式? 我想制作一个按钮,当点击按钮时,放置并删除样式。 我想过做一个if,但我怎么比较?
StyledDocument doc = texto.getStyledDocument();
int start = texto.getSelectionStart();
int end = texto.getSelectionEnd();
if (start == end) { // No selection, cursor position.
return;
}
if (start > end) { // Backwards selection?
int life = start;
start = end;
end = life;
}
Style style = texto.addStyle("negra", null);
StyleConstants.setBold(style, true);
doc.setCharacterAttributes(start, end - start, style, false);
答案 0 :(得分:3)
我使用了你的代码并让它以这种方式工作。希望它有所帮助。
package main;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.text.*;
public class Main {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JTextPane textPane = new JTextPane();
JButton button = new JButton("Test");
public Main() {
frame.setTitle("Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel.setLayout(new BorderLayout());
panel.setPreferredSize(new Dimension(200, 200));
panel.add(textPane, BorderLayout.CENTER);
panel.add(button, BorderLayout.SOUTH);
textPane.addStyle("negra", null);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
StyledDocument doc = textPane.getStyledDocument();
int start = textPane.getSelectionStart();
int end = textPane.getSelectionEnd();
if (start == end) { // No selection, cursor position.
return;
}
if (start > end) { // Backwards selection?
int life = start;
start = end;
end = life;
}
Style style = textPane.getStyle("negra");
// I think this is what you need
if (StyleConstants.isBold(style)) {
StyleConstants.setBold(style, false);
} else {
StyleConstants.setBold(style, true);
}
doc.setCharacterAttributes(start, end - start, style, false);
}
});
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Main();
}
});
}
}
答案 1 :(得分:0)
我为你做了一个演示,注意JTextPane相关问题似乎是一个复杂的问题,我还没有掌握它的所有方面。
该演示为您提供了一些可行的方法,您需要对其进行改进以满足您的需求。
选择文本并单击按钮以查看样式更改。
代码如下:package com.learningjava;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.text.AttributeSet;
import javax.swing.*;
import javax.swing.text.*;
/**
* Note: code is a possible way to do
* you need to improved it to meet your requirements
*
* @author wangdq
* 2013-1-3
*/
public class TextPaneStyleTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
JFrame frame = new TextStyleTestFrame();
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
/**
* TextPane style test frame
* Select text and click the button to see style change
*/
class TextStyleTestFrame extends JFrame {
public TextStyleTestFrame() {
super("TextPaneStyle Test");
textPane.setText("Smaple String");
this.add(textPane,BorderLayout.CENTER);
JPanel panel = new JPanel();
panel.add(btnStyle);
this.add(panel,BorderLayout.NORTH);
btnStyle.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
changeStyle();
}
});
}
/**
* change style according to your rule
*/
private void changeStyle() {
//get selected text style
StyledDocument doc=(StyledDocument)textPane.getDocument();
int selectionEnd=textPane.getSelectionEnd();
int selectionStart=textPane.getSelectionStart();
if(selectionStart == selectionEnd) {
return;
}
Element element=doc.getCharacterElement(selectionStart);
AttributeSet as = element.getAttributes();
//apply a new style based on previous
MutableAttributeSet asNew = new SimpleAttributeSet(as.copyAttributes());
StyleConstants.setBold(asNew, !StyleConstants.isBold(as));
doc.setCharacterAttributes(selectionStart,textPane.getSelectedText().length(), asNew, true);
String text = (StyleConstants.isBold(as) ? "Cancel Bold":"Bold");
btnStyle.setText(text);
}
private static final long serialVersionUID = 1L;
private JButton btnStyle = new JButton("Bold");
private JTextPane textPane =new JTextPane();
}