簡體   English   中英

java獲取字體樣式jtextpane

[英]java get font style jtextpane

我有這段代碼將選定的文本加粗,並且工作正常,但是如何刪除樣式呢? 我要創建一個按鈕,單擊該按鈕時,放置並刪除樣式。 我想到了一個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);

我用你的代碼,並使其以這種方式工作。 希望能幫助到你。

    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();
            }
        });

    }
}

我為您做了一個演示,請注意與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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM