2013-11-11 3 views
0

Мне нужно, чтобы пользователь мог изменить цвет текста нажатием кнопки. Это нормально, когда есть выбор - текст изменит цвет. Однако, когда длина выделения равна 0, когда у меня есть только каретка, ничего не изменится, и это совершенно нормально.Управление изменением атрибута в JTextPane

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

Попробуйте открыть документ MS Word, введите текст, нажмите «ПРАВО ПЕРЕД» ИЛИ «ПРАВО ПОСЛЕ СЛОВА». Не нажимайте внутри самого слова. Теперь измените цвет текста - ничего (видимого) не произойдет. Продолжайте вводить текст - цвет напечатанного текста - тот, который вы изменили.

Теперь попробуйте сделать то же самое с программой ниже, и цвет не изменится. Как я могу это сделать?

Вот SSCCE, для вашего удобства, но это просто нормально Java 7, никакого специального материала:

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 

import javax.swing.BoxLayout; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JTextPane; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.Style; 
import javax.swing.text.StyleConstants; 
import javax.swing.text.StyleContext; 


public class Main 
{ 
    public static void main(String[] args) 
    { 
     JFrame a = new JFrame("Test"); 
     a.setSize(600, 900); 
     a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     a.getContentPane().setLayout(new BoxLayout(a.getContentPane(), BoxLayout.Y_AXIS)); 

     final JTextPane b = new JTextPane(); 
     b.addFocusListener(new FocusListener() 
     { 
      @Override 
      public void focusGained(FocusEvent arg0) 
      { 
       b.repaint(); 
      } 

      @Override 
      public void focusLost(FocusEvent arg0) 
      { 
       b.repaint(); 
      } 
     }); 

     StyleContext context = new StyleContext(); 
     final Style styleA = context.addStyle("A", null); 
     final Style styleB = context.addStyle("B", null); 


     StyleConstants.setForeground(styleA, Color.BLUE); 
     StyleConstants.setForeground(styleB, Color.RED);    

     try 
     { 
      b.getStyledDocument().insertString(0, "blablablablabla", styleA); 
     } 

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

     JButton c = new JButton("click me"); 
     c.addActionListener(new ActionListener() 
     { 
      @Override 
      public void actionPerformed(ActionEvent arg0) 
      { 
       b.getStyledDocument().setCharacterAttributes(b.getSelectionStart(), b.getSelectionEnd() - b.getSelectionStart(), styleB, true); 
       b.grabFocus(); 
      } 
     }); 

     a.getContentPane().add(b); 
     a.getContentPane().add(c); 

     a.setVisible(true); 
    } 
} 
+1

'Вот вам SSCCE, для вашего удобства' - было бы удобнее, если бы вы отправили SSCCE с оригинальным вопросом назад. Вы задали достаточно вопросов на форуме, чтобы знать, что SSCCE должен быть опубликован со всеми вашими вопросами, чтобы показать, что вы делаете, когда сталкиваетесь с проблемой. – camickr

ответ

1

Прочитайте раздел из свинга учебника по Text Component Features для рабочей демонстрации, которая делает то, что вы хотите. Это действия по умолчанию в редакторе работают так, как вы ожидали. Поэтому я бы предложил вам посмотреть исходный код StyledEditorKit и посмотреть на BoldAction, чтобы понять, как это сделать.

Я никогда не использовал StyleContext, поэтому я не совсем уверен, как они работают. Я использую SimpleAttributSet, что-то вроде:

SimpleAttributeSet red = new SimpleAttributeSet(); 
StyleConstants.setForeground(red, Color.RED); 

Затем, чтобы изменить атрибут Я хотел бы использовать:

textPane.getStyledDocument().setCharacterAttributes(??, ??, red, false); 

Теперь это часть я не делал раньше, но в основном вы должны изменить «входные атрибуты». Я думаю, что код-то вроде:

MutableAttributeSet inputAttr = textPane.getInputAttributes(); 
inputAttr.addAttributes(red); 

Опять же, проверить с исходным кодом от StyledEditorKit (я упростил код, чтобы он не может быть точным).

Смежные вопросы