java获取字体样式jtextpane
我有这段代码将所选文本以粗体显示,效果很好,但是如何删除样式呢? 我想制作一个按钮,当单击按钮时,可以放置和删除样式。 我想做一个假设,但我怎么能比较呢java获取字体样式jtextpane,java,swing,get,styles,jtextpane,Java,Swing,Get,Styles,Jtextpane,我有这段代码将所选文本以粗体显示,效果很好,但是如何删除样式呢? 我想制作一个按钮,当单击按钮时,可以放置和删除样式。 我想做一个假设,但我怎么能比较呢 StyledDocument doc = texto.getStyledDocument(); int start = texto.getSelectionStart(); int end = texto.getSelectionEnd(); if (start == end) { // No selection
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);
我为你们做了一个演示,注意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();
}
我为你们做了一个演示,注意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();
}
我为你们做了一个演示,注意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();
}
我为你们做了一个演示,注意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();
}
我用了你的代码,让它这样工作。希望能有帮助
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();
}
});
}
}
我用了你的代码,让它这样工作。希望能有帮助
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();
}
});
}
}
我用了你的代码,让它这样工作。希望能有帮助
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();
}
});
}
}
我用了你的代码,让它这样工作。希望能有帮助
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();
}
});
}
}
doc.setCharacterAttributes(selectionStart、selectionEnd selectionStart+1、asNew、true);也将删除所有rest样式。因此,如果删除粗体,斜体也将被删除。StanislavL,为了防止这种情况发生,我复制了当前选择样式,并使用一个新属性集做了一些更改。复制?如果我选择3个片段,每个片段具有不同的样式,会怎么样?e、 斜体,粗体+斜体,粗体+下划线?你运行我的代码了吗?它适用于我的示例文本。可能我不知道您需要的全部细节,要处理段落和其他段样式,您需要编写更多代码。doc.setCharacterAttributes(selectionStart,selectionEnd selectionStart+1,asNew,true);也将删除所有rest样式。因此,如果删除粗体,斜体也将被删除。StanislavL,为了防止这种情况发生,我复制了当前选择样式,并使用一个新属性集做了一些更改。复制?如果我选择3个片段,每个片段具有不同的样式,会怎么样?e、 斜体,粗体+斜体,粗体+下划线?你运行我的代码了吗?它适用于我的示例文本。可能我不知道您需要的全部细节,要处理段落和其他段样式,您需要编写更多代码。doc.setCharacterAttributes(selectionStart,selectionEnd selectionStart+1,asNew,true);也将删除所有rest样式。因此,如果删除粗体,斜体也将被删除。StanislavL,为了防止这种情况发生,我复制了当前选择样式,并使用一个新属性集做了一些更改。复制?如果我选择3个片段,每个片段具有不同的样式,会怎么样?e、 斜体,粗体+斜体,粗体+下划线?你运行我的代码了吗?它适用于我的示例文本。可能我不知道您需要的全部细节,要处理段落和其他段样式,您需要编写更多代码。doc.setCharacterAttributes(selectionStart,selectionEnd selectionStart+1,asNew,true);也将删除所有rest样式。因此,如果删除粗体,斜体也将被删除。StanislavL,为了防止这种情况发生,我复制了当前选择样式,并使用一个新属性集做了一些更改。复制?如果我选择3个片段,每个片段具有不同的样式,会怎么样?e、 斜体,粗体+斜体,粗体+下划线?你运行我的代码了吗?它适用于我的示例文本。也许我不知道您需要的全部细节,为了处理段落和其他段样式,您需要编写更多代码。您是否尝试将其设置为false StyleConstants.setBold(style,false);?您是否尝试将其设置为false StyleConstants.setBold(style,false);?您是否尝试将其设置为false StyleConstants.setBold(style,false);?您是否尝试将其设置为false StyleConstants.setBold(style,false);?