Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > выделение в JTextPane без фокуса


Автор: Mirkes 9.2.2012, 19:08
Программа реализует интерпретатор с примитивного языка.
во время исполнения хочется видеть, какая строка в данный момент выполняется.
Текст программы набирается в JTextPane
Попытался использовать выделение в JTextPane, но оно видно только в том случае, когда фокус находится в JTextPane.
А при пошаговом исполнении фокус переходит к другим компонентам.
Можно ли как-нибудь заставить JTextPane отображать выделение без фокуса?
Может кто подскажет другой путь показа исполняемой строки?

Автор: COVD 9.2.2012, 20:09
"строка" - замените JTextPane на JTable. 

Автор: Mirkes 10.2.2012, 02:35
Цитата(COVD @  9.2.2012,  20:09 Найти цитируемый пост)
"строка" - замените JTextPane на JTable.  

Интересно, если Вас заставить писать каждую строку программы в отдельной строке таблицы, что Вы скажете разработчику?

Автор: dorogoyIV 10.2.2012, 09:15
ну можно, например, так же примерно, как в твоей предыдущей теме, в RowHeader JScrollPane рисовать напротив нужной строки какой нибудь маркер (кружочек что ли...). надо будет расчитать положение и высоту строки. на JScrollPane ложить JTextPane.

Автор: lBugl 10.2.2012, 09:15
что-то типа того?
(кривовато но суть будет понятна, кликайте по кнопке)

Код

package test;

import java.awt.Color;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;


public class NewClass extends javax.swing.JFrame {
    SimpleAttributeSet style = new SimpleAttributeSet();
    StyledDocument doc;
    int i = 0;
        
    public NewClass() {
        initComponents();
        jTextPane1.setText("1\n2\n3\n4\n5\n6\n");
        doc = jTextPane1.getStyledDocument();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTextPane1 = new javax.swing.JTextPane();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jScrollPane1.setViewportView(jTextPane1);

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                        .addContainerGap())
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addContainerGap(318, Short.MAX_VALUE))))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 70, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(148, 148, 148)
                .addComponent(jButton1)
                .addContainerGap(37, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        StyleConstants.setBackground(style, new Color(102,51,204));
        doc.setCharacterAttributes(i*2 , 2, style, true);
        StyleConstants.setBackground(style, Color.WHITE);
        doc.setCharacterAttributes((i-1)*2 , 2, style, true);
        jTextPane1.setCaretPosition(i*2);
        i++;
        if (i > 6) i = 0;
    }

    public static void main(String args[]) {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new NewJFrame1().setVisible(true);
            }
        });
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextPane jTextPane1;

}

Автор: Mirkes 10.2.2012, 11:00
Спасибо, что-то в этом роде я и искал. Попробую адаптировать для своих нужд

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)