Атрибут изменения стиля Java для следующего ввода

У меня есть JTextPane и флажок, представляющий, скажем, жирный шрифт. Поэтому, если флажок установлен, я хочу, чтобы все, что я печатаю в JTextPane, было выделено жирным шрифтом. Я не хочу менять весь шрифт для JTextPane, я просто хочу установить следующий символ жирным шрифтом. Я сделал это, и это работает:

///framework is JTextPane
framework.addKeyListener(new KeyListener() {
        StyledDocument doc = framework.getStyledDocument();
        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            if(boldcheck.isSelected()){


                StyleContext sc = new StyleContext();
                Style ns = sc.addStyle("a", null);
                ns.addAttribute(StyleConstants.Bold, new Boolean(true));



                try {
                    String s = Character.toString(e.getKeyChar());
                    doc.insertString(doc.getLength(),s, ns);
                    framework.remove(doc.getLength());

                } catch (BadLocationException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }




            }
  ///// rest of keylistener

но я не думаю, что это хорошая идея

                    doc.insertString(doc.getLength(),s, ns);
                    framework.remove(doc.getLength());

Я пробовал с doc.setCharacterAttributes(doc.getLength(),1, ns, true) но это не сработает, и если я сделаю doc.setCharacterAttributes(doc.getLength()-1,1, ns, true) в keyReleased это будет работать плохо, и я имею в виду, что сначала увидит то, что я напечатал, а затем я увижу, что оно меняется, и если я наберу быстро, это не изменит атрибуты для некоторых букв. Так кто-нибудь знает лучший способ сделать это?

1 ответ

Следующий исполняемый код может удовлетворить ваши требования. Я оставляю вам решать, лучше это или нет. Надеюсь, это полезно.

public class TextEditorDemo {

   private JTextPane textpane;
   private JCheckBox checkbox;

   public TextEditorDemo()
   {
        initGUI();

        textpane.getStyledDocument().addDocumentListener(new DocumentListener()
        {
            @Override
            public void changedUpdate(DocumentEvent arg0) 
            {

            }

            @Override
            public void insertUpdate(DocumentEvent arg0) 
            {
                if(checkbox.isSelected())
                {
                     setBold(arg0);
                }
            }

            @Override
            public void removeUpdate(DocumentEvent arg0)
            {

            }
        });
   }

   private void initGUI()
   {
        JFrame frame = new JFrame("TextEditorDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);

        checkbox = new JCheckBox("Bold");
        textpane = new JTextPane();

        frame.getContentPane().add(checkbox, BorderLayout.NORTH);
        frame.getContentPane().add(textpane, BorderLayout.CENTER);
        frame.setVisible(true);
   }

   private void setBold(final DocumentEvent evt) 
   {
        if(evt.getLength() <= 1)
        {
             Runnable setColor = new Runnable() 
             {
                  @Override
                  public void run() 
                  {
                       Style style = textpane.addStyle("insert", null);
                       StyleConstants.setBold(style, true);
                       textpane.getStyledDocument().setCharacterAttributes(evt.getOffset(), evt.getLength(), style, true);
                  }
             };    
             SwingUtilities.invokeLater(setColor);
        }
    }

    public static void main(String[] args)
    {
        TextEditorDemo demo = new TextEditorDemo();
    }
}
Другие вопросы по тегам