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


Автор: Swatch 14.9.2007, 12:19
Добрый день.

Поделитесь советом, как сделать так, чтобы при выделении ячейки в таблице, ее содержимое (текст, цифры, даты) выделялось цветом?
Ячейка редактируема по одному клику. надо, чтобы как только ее выбирали, то, если в ней есть текст, чтобы он выделялся цветом. Не сама ячейка, а именно текст. smile  smile 

Автор: powerOn 14.9.2007, 12:27
попробуй для начала setSelectionForeground, если не то, то нужно свой рендерер писать

Автор: Swatch 14.9.2007, 12:34
придется рендерер писать:( потому что setSelectionForeground уже попробовалаsmile не помогло smile

Добавлено через 45 секунд
а как в рендерере указать, чтобы текст выделился, не подскажите?

Автор: Swatch 14.9.2007, 12:56
Написала вот так:
Код

public class MyTableCellRenderer extends JTextField implements TableCellRenderer{
    
    protected Color background;
    protected Color foreground;
    
    /** Creates a new instance of MyTableCellRenderer */
    public MyTableCellRenderer() {
    }
    
    public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, 
                        int row, int column){
            background = new java.awt.Color(255,255,255);
            foreground = new java.awt.Color(0, 0, 0);           
        
            JTextField tf = new JTextField(value.toString());
            tf.setBackground(background);
            tf.setForeground(foreground);
            table.setCellSelectionEnabled(true);
            tf.setEditable(true);
            tf.setFont(new java.awt.Font("Arial", 0, 12));
            tf.setBackground(background);
            tf.setSelectionStart(0);
            tf.setSelectionEnd(tf.getText().length());
            tf.setSelectedTextColor(Color.BLACK);
            return tf;
        
    }
}


На jTableMousePressed написала:
Код

jTable1.getColumnModel().getColumn(0).setCellRenderer(new MyTableCellRenderer());


Но текст почему-то не выделяется:( 

В чем млжет быть проблема??? smile 

Автор: powerOn 14.9.2007, 13:05
Ой, мне кажется что я вас обманул.  smile 
Если текст должен быть подсвечен при редактировании, значит нужен Editor, а не Renderer...

Автор: powerOn 14.9.2007, 13:20
Вот что получилось в простейшем случае:

Код

public class NewJFrame extends javax.swing.JFrame
{
    public NewJFrame()
    {
        initComponents();
        
        JTextField jtf = new JTextField();
        jtf.setForeground(Color.RED);

        jTable1.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(jtf));
    }
                          
    private void initComponents()
    {
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][]
            {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String []
            {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);

        pack();
    }                        
    

    public static void main(String args[])
    {
        java.awt.EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                new NewJFrame().setVisible(true);
            }
        });
    }
                   
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
}

Автор: Swatch 14.9.2007, 13:21
А можно пример Editor-а?

Оставила то же самое, только TableCellRenderer исправила на TableCellEditor. Вы дает ошибку, что 
MyTableCellEditor.java:25: classes.MyTableCellEditor is not abstract and does not override abstract method removeCellEditorListener(javax.swing.event.CellEditorListener) in javax.swing.CellEditor
:(

В чем тут дело?

И потом, как устанавливать Editor и когда? 
Подойдет на jTableMouse Click? Вот так можно:?
Код

        int i = jTable1.getEditingRow();
        int j = jTable1.getEditingColumn();
        if (jTable1.getModel().isCellEditable(i,j) == true){
            jTable1.setCellEditor(new MyTableCellEditor());
        }


Добавлено через 9 минут и 54 секунды
То, что вы написали, работает. Только мне нужно, чтобы не текст изменял цвет, а чтобы то, что в ячейке, выделялось (как когда выделяют текст, чтобы удалить). Я написала вот так:
Код

       JTextField jtf = new JTextField();
        jtf.setSelectionStart(0);
        jtf.setSelectionEnd(jtf.getText().length());
        jtf.setSelectedTextColor(Color.BLACK);
        jtf.setEditable(true);
        
        jTable1.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(jtf));
        for (int row=0; row<jTable1.getRowCount(); row++){
            DefaultCellEditor editor = (DefaultCellEditor)jTable1.getCellEditor(row,0);    
            editor.setClickCountToStart(1);
        } 


Но этот код не работает. :( как-нибудь можно заставить его работать???

Автор: powerOn 14.9.2007, 13:36
А если так попробовать?
Код

        JTextField jtf = new JTextField();
        
        jtf.addFocusListener(new FocusAdapter()
        {
            public void focusGained(FocusEvent e)
            {
                JTextField jtf = (JTextField) e.getSource();
                
                jtf.setSelectionStart(0);
                jtf.setSelectionEnd(jtf.getText().length());
            }
        });
        

        jTable1.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(jtf));

Автор: Swatch 14.9.2007, 15:17
да, это помогло.

Только теперь появилась проблема. в первый столбец можно записывать только Double. если пытаться вписать туда что-то другое и потом покинуть ячейку, то программа падает с ошибкой:
java.lang.IllegalArgumentException: Cannot format given Object as a Number. 

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

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