How do I set both StrikeThrough and Underline styling options for text inside a JTextPane?

后端 未结 1 484
再見小時候
再見小時候 2021-01-06 14:14

I have a JTextPane component and I am trying to style the text that will be typed by the user to be both underline and strikethrough at the same time.

The relevant s

1条回答
  •  孤街浪徒
    2021-01-06 14:39

    Why not working with StyledDocument and using two Style: primary and secondary, where primary is parent style of secondary:

    enter image description here

      StyledDocument styleDocument =  jTextPane1.getStyledDocument();
      Style primaryStyle = styleDocument.addStyle("Primary", null);
      Style secondaryStyle = styleDocument.addStyle("Secondary", primaryStyle);
    
    
      StyleConstants.setFontFamily(primaryStyle, "American Captain");
      StyleConstants.setFontSize(primaryStyle, 24);
    
    //  StyleConstants.setFontFamily(secondaryStyle, "Bira PERSONAL USE ONLY");
      StyleConstants.setFontSize(secondaryStyle, 20);
      StyleConstants.setForeground(primaryStyle, new Color(0x552AFF));
      StyleConstants.setForeground(secondaryStyle, Color.black);
      StyleConstants.setStrikeThrough(secondaryStyle, true);
      StyleConstants.setUnderline(primaryStyle, true);
    
      try {
          styleDocument.insertString(0, "Title with American Captain font\n\n", primaryStyle);
          styleDocument.insertString(styleDocument.getLength(), "Font demonstration with JTextPane. "
                  + "Seriously, it is powerful and has the power to do all kind of styling with text. "
                  + "check it out, check its mighty power and be embrassed\n", secondaryStyle);
       } catch (BadLocationException ex) {
                    Logger.getLogger(JTextPaneTest.class.getName()).log(Level.SEVERE, null, ex);
       }
    

    Edit:

    imagine you have 4 toggle buttons - italic, bold, underline and strikethrough. Each time one of those is pressed or unpressed I need to adjust the styling as necessary for the character that will be typed next.

    Yes, the answer still lies in the preference of using DefaultStyleDocument and extending it. The above example should give an idea how styling with Style works while inserting string with styleDocument.insertString(int offs, String str, AttributeSet a) method. When we are inserting data using KeyBoard or copy-paste the associating StyleDocument's insertString function always gets called.

    So, to style like a text editor as you are wanting, all you have to do is to extends the DefaultStyleDocument and override this insertString function and pass the specific style attribute you want.

    A Demo example satisfying your complete requirement should make this things clear.

    enter image description here

    class CStyleDocument extends DefaultStyledDocument
    {
        private  Style primaryStyle;
    
        public CStyleDocument() {
            super();
             primaryStyle = this.addStyle("Primary", null);
        }
        public Style getAttrStyle()
        {
            return primaryStyle;
        }
    
        @Override
        public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
            super.insertString(offs, str, primaryStyle); 
    
        }
    
    }
    
    public class JTextPaneTest extends javax.swing.JFrame {
    
        CStyleDocument styleDocument;
    
        public JTextPaneTest() {
            initComponents();
    
            styleDocument = new CStyleDocument();
            jTextPane1.setDocument(styleDocument);
    
    }
    
        @SuppressWarnings("unchecked")
        //                           
        private void initComponents() {
    
            jScrollPane1 = new javax.swing.JScrollPane();
            jTextPane1 = new javax.swing.JTextPane();
            jPanel1 = new javax.swing.JPanel();
            boldSelButton = new javax.swing.JToggleButton();
            ulSelButton = new javax.swing.JToggleButton();
            strkSelButton = new javax.swing.JToggleButton();
    
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setMinimumSize(new java.awt.Dimension(400, 200));
    
            jScrollPane1.setViewportView(jTextPane1);
    
            getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
    
            boldSelButton.setText("Bold");
            boldSelButton.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent evt) {
                    boldSelButtonStateChanged(evt);
                }
            });
            jPanel1.add(boldSelButton);
    
            ulSelButton.setText("Under Lined");
            ulSelButton.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent evt) {
                    ulSelButtonStateChanged(evt);
                }
            });
            jPanel1.add(ulSelButton);
    
            strkSelButton.setText("Strike Through");
            strkSelButton.addChangeListener(new javax.swing.event.ChangeListener() {
                public void stateChanged(javax.swing.event.ChangeEvent evt) {
                    strkSelButtonStateChanged(evt);
                }
            });
            jPanel1.add(strkSelButton);
    
            getContentPane().add(jPanel1, java.awt.BorderLayout.PAGE_START);
    
            pack();
        }//                         
    
        private void boldSelButtonStateChanged(javax.swing.event.ChangeEvent evt) {                                           
                 StyleConstants.setBold(styleDocument.getAttrStyle(), ((JToggleButton)evt.getSource()).isSelected());
                 jTextPane1.requestFocus();
    
    
    
    
        }                                          
    
        private void ulSelButtonStateChanged(javax.swing.event.ChangeEvent evt) {                                         
            StyleConstants.setUnderline(styleDocument.getAttrStyle(), ((JToggleButton)evt.getSource()).isSelected());
            jTextPane1.requestFocus();
        }                                        
    
        private void strkSelButtonStateChanged(javax.swing.event.ChangeEvent evt) {                                           
           StyleConstants.setStrikeThrough(styleDocument.getAttrStyle(), ((JToggleButton)evt.getSource()).isSelected());
           jTextPane1.requestFocus();
        }                                          
    
    
        public static void main(String args[]) {
    
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    JFrame frame = new JTextPaneTest();
                    frame.setVisible(true);
    
                }
            });
        }
        // Variables declaration - do not modify                     
        private javax.swing.JToggleButton boldSelButton;
        private javax.swing.JPanel jPanel1;
        private javax.swing.JScrollPane jScrollPane1;
        private javax.swing.JTextPane jTextPane1;
        private javax.swing.JToggleButton strkSelButton;
        private javax.swing.JToggleButton ulSelButton;
        // End of variables declaration                   
    }
    

    0 讨论(0)
提交回复
热议问题