2011-05-05 2 views
1

Почему текст в JTextPane не может быть выбран программно, если присутствует JTextField? Я думаю, что-то с фокусом. Спасибо.конфликт выбора текста между JTextPane и JTextField

import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import java.beans.PropertyChangeListener; 

import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.ActionMap; 
import javax.swing.InputMap; 
import javax.swing.JComponent; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JTextPane; 
import javax.swing.KeyStroke; 

public class align extends JFrame { 

    private align() { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     addPane(this, "one"); 
     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     align t = new align(); 
    } 

    private void addPane(JFrame frame, String name) { 

     JPanel panel = new JPanel(); 
     panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     // if the next line is disabled, then the text is JTextPane is correctly highlighted.,, 
     panel.add(makeField("line1")); 

     JTextPane p = new JTextPane(); 
     p.setText("abcdef"); 
     p.setSelectionStart(2); 
     p.setSelectionEnd(4); 
     p.setFocusable(true); 
     p.requestFocus(); 
     p.requestDefaultFocus(); 
     panel.add(p); 

     frame.getContentPane().add(panel); 
    } 

    private JComponent makeField(String name) { 
     JTextField textArea = new JTextField(); 
     textArea.setText(name); 
     textArea.setEditable(false); 

     return textArea; 
    } 
} 

EDIT:

Понял, чтобы отобразить выбранный текст обжига ключевого события после того, как кадр был построен. Лучшее (более длинное) решение состояло бы в том, чтобы иметь текстовый файл только для чтения с настраиваемыми Highlighter и DocumentListener, который поддерживает обновление буфера обмена в Ctrl-C.

Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(
      new KeyEvent(textPane, KeyEvent.KEY_PRESSED, System.currentTimeMillis(), 0, KeyEvent.VK_TAB)); 
+2

Не используйте устаревшие методы, такие как 'JComponent.requestDefaultFocus()'. –

+0

, пожалуйста, узнайте и используйте соглашения об именах java – kleopatra

ответ

3

Текст в JTextPaneявляется выбран. Беда в том, что он не дает никакого визуального указания, если компонент не сфокусирован. Попробуйте вставить вкладку в компонент после отображения GUI.


так, я должен освободить отметить это?

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

Учитывая JTextPane является компонентом, который поддерживает форматирование, возможно, сделать текст жирным шрифтом или наклонным, например.

+0

, так что я должен выпустить примечание об этом ?? «дорогой пользователь, нажмите клавишу вкладок, чтобы увидеть выбор?» lol – Saideira

3

Может быть, вы должны использовать Маркером так появляется подсветка во всех текстовых компонентов:

Highlighter.HighlightPainter yellow = 
    new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 

try 
{ 
    textPane.getHighlighter().addHighlight(2, 4, yellow); 
} 
catch(BadLocationException ble) { System.out.println(ble); } 
+0

Умный подход. Тем не менее, ненавижу цвет. ;) –

+0

Да, это сработает, если мне понадобится подсветка для косметических целей. Мне нужен реальный выбор для функций буфера обмена. – Saideira

+1

@Saideira, тогда вам нужно отображать только один выбор за раз, потому что функция копирования в буфер обмена работает только с компонентом, который имеет фокус. Так что это не проблема. – camickr

3
p.getCaret().setSelectionVisible(true); 
+0

cool - мой предмет изучения дня (пока :-) – kleopatra

+0

только, как сохранить его таким образом? как только панель прошла через focusGained/-Lost, видимость выбора снова исчезнет. Hmm ... – kleopatra

+0

правый. Если фокус потерян, выбор установлен на значение false, но можно использовать собственный карет, например. расширьте DefaultCaret и переопределите логику. – StanislavL

3

Просто для удовольствия (в конце концов, это в пятницу :-) Я последовал комментарий Станислава, простираясь DefaultCaret чтобы сохранить выделение видимым для несфокусированных текстовых компонентов.

Основные идеи

  • поддерживает два выбор украшения: сфокусированный отбор, сфокусировано отбор
  • сохранить внешний вид основных моментов выбора как можно ближе к LAF по умолчанию, как это возможно, что сводится к повторному использованию selectionPainter (доступен только ... кашель, кашель .. отражение)
  • дурак супер, полагая, что выбор всегда виден

    public static class WrappingCaret extends DefaultCaret { 
    
        private DefaultCaret delegate; 
        private HighlightPainter focusedSelectionPainter; 
        private HighlightPainter unfocusedSelectionPainter; 
        private boolean focusedSelectionVisible; 
    
        public WrappingCaret(JTextComponent target) { 
         installDelegate((DefaultCaret) target.getCaret()); 
         target.setCaret(this); 
        } 
    
        private void installDelegate(DefaultCaret delegate) { 
         this.delegate = delegate; 
         setBlinkRate(delegate.getBlinkRate()); 
        } 
    
        private void installSelectionPainters() { 
         if (delegate instanceof BasicCaret) { 
          installDefaultPainters(); 
         } else { 
          try { 
           Method method = delegate.getClass().getDeclaredMethod(
             "getSelectionPainter"); 
           method.setAccessible(true); 
           focusedSelectionPainter = (HighlightPainter) method 
             .invoke(delegate); 
           Constructor<?>[] constructors = focusedSelectionPainter 
             .getClass().getDeclaredConstructors(); 
           constructors[0].setAccessible(true); 
           unfocusedSelectionPainter = (HighlightPainter) constructors[0] 
             .newInstance(getUnfocusedSelectionColor()); 
          } catch (Exception e) { 
           installDefaultPainters(); 
          } 
         } 
        } 
    
        private Color getUnfocusedSelectionColor() { 
         Color first = getComponent().getSelectionColor(); 
         // create a reasonable unfocusedSelectionColor 
         return PaintUtils.setAlpha(first, 125); 
        } 
    
        private void installDefaultPainters() { 
         focusedSelectionPainter = super.getSelectionPainter(); 
         unfocusedSelectionPainter = new DefaultHighlightPainter(
           getUnfocusedSelectionColor()); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        public void install(JTextComponent c) { 
         super.install(c); 
         installSelectionPainters(); 
         setSelectionVisible(isSelectionVisible()); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        public void setSelectionVisible(boolean vis) { 
         focusedSelectionVisible = vis; 
         super.setSelectionVisible(!isSelectionVisible()); 
         super.setSelectionVisible(true); 
        } 
    
        /** 
        * @inherited <p> 
        */ 
        @Override 
        protected HighlightPainter getSelectionPainter() { 
         return focusedSelectionVisible ? focusedSelectionPainter 
           : unfocusedSelectionPainter; 
        } 
    
    } 
    

Наслаждайтесь!

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