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);?