После того, как для ячейки JTable установите значениеDefaultRenderer в jTextArea, как выделить выделенную строку в jTextArea. - PullRequest
1 голос
/ 03 июля 2010

Это мой рендерер

class tblCalendarRenderer extends JTextArea implements TableCellRenderer {

    JTextArea textField;

    public tblCalendarRenderer() {
        textField = new JTextArea();
    }

    public Component getTableCellRendererComponent(JTable table,
            Object value, boolean selected, boolean focused, int row,
            int column) {
        textField.setText(value == null ? "" : value.toString());
        textField.setLineWrap(true);
        textField.setWrapStyleWord(true);

        if (column == 0 || column == 6) { // Week-end
            textField.setBackground(new Color(255, 220, 220));
        } else { // Week
            textField.setBackground(new Color(255, 255, 255));
        }
        if (row % 2 == 0) {
            if (value != null) {
                if (Integer.parseInt(value.toString()) == realDay
                        && currentMonth == realMonth
                        && currentYear == realYear) { // Today
                    textField.setBackground(new Color(220, 220, 255));
                }
            }
            textField.setFont(new java.awt.Font("Dialog",
                    java.awt.Font.BOLD, 11));
        } else {
            textField.setFont(new java.awt.Font("Dialog",
                    java.awt.Font.BOLD, 12));
        }
        if (selected && row % 2 != 0) {
            textField.setBackground(Color.LIGHT_GRAY);
            textField.setForeground(Color.black);
        }

        textField.setBorder(null);
        return textField;
    }
}

Это код, который я попытался выделить в строке jTextArea.Как я могу добавить его в jTable?я попытался добавить textField.addCaretListener (new ExampleCaretListener ());Но он все равно выберет целую ячейку jTable.

    class ExampleCaretListener implements CaretListener {

    public void caretUpdate(CaretEvent e) {
        Color HILIT_COLOR = Color.LIGHT_GRAY;
        final Highlighter.HighlightPainter painter;
        painter = new DefaultHighlighter.DefaultHighlightPainter(
                HILIT_COLOR);
        JTextArea textField = (JTextArea) e.getSource();
        String lineText = "";
        try {
            int dot = e.getDot();
            int rowStart = Utilities.getRowStart(textField, dot);
            int rowEnd = Utilities.getRowEnd(textField, dot);
            System.out.println(dot + " " + rowStart + " " + rowEnd);
            lineText = textField.getText(rowStart, (rowEnd - rowStart));
            textField.getHighlighter().removeAllHighlights();
            textField.getHighlighter().addHighlight(rowStart, rowEnd,
                    painter);
        } catch (BadLocationException ex) {
            System.out.println(ex);
        }

    }

}

Ответы [ 2 ]

0 голосов
/ 03 июля 2010

Средство визуализации просто рисует вашу область JTextArea внутри ячейки как изображение. Так что выделение текста не сработает. Единственное, что может работать в IMO, - это использовать JEditorPane для вашего рендерера со стилем текста, чтобы выделить соответствующую часть.

Подробнее на http://java.sun.com/docs/books/tutorial/uiswing/components/editorpane.html#recap

0 голосов
/ 03 июля 2010

Я предполагаю, что содержимое каждой ячейки - это номер даты, поэтому я не уверен, что вы пытаетесь сделать или где у вас есть несколько строк в одной ячейке. Вы имели в виду выбор ячейки таблицы вместо всей строки? Если это то, что вы имели в виду, вы можете сделать это, изменив модели выбора строк / столбцов для вашей таблицы. Если это не так, пожалуйста, сузьте проблему и предоставьте полный (очищенный) исходный код.

Редактировать:

Как сказал eugener, рендерер просто рисует вашу JTextArea внутри ячейки как изображение, основанное на значении для этой ячейки. Однако вы можете создать свою собственную пользовательскую модель для представления состояния ячейки (вместо простого значения String, которое вы можете использовать, например, MyModel, который содержит String и некоторые дополнительные данные) и визуализировать ячейку на основе этой модели. Например: вы можете обнаружить щелчки мыши (подключить слушатель мыши к Jtable), а затем изменить состояние этой модели - обновить начало и конец выделения на основе положения мыши для определенного значения ячейки. Внутри getCellRenderer приведите значение к типу вашего объекта (MyModel), которое содержит начальные и конечные данные выбора и использует их для визуализации текстовой области.

Вот пример кода, который увеличивает выделение при щелчке по ячейке (вы должны изменить ее, чтобы установить правильные позиции каретки на основе позиции щелчка мыши), код грязный (его нужно немного почистить), но работает:

вставьте это в свой рендерер ячейки:

CellValue myValue = (CellValue)value;
HighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(
        Color.green);
textField.getHighlighter().removeAllHighlights();
try {
    textField.getHighlighter().addHighlight(myValue.highlightStart, myValue.highlightEnd, painter);
} catch (BadLocationException e) {
    System.out.println("Miss");
}

А вот пример MyModel:

public class MyModel extends AbstractTableModel {
    class CellValue {
        String value;
        int highlightStart;
        int highlightEnd;

        CellValue(String val) {
            this.value = val;
        }

        @Override
        public String toString() {
            return value;
        }
    }

    CellValue[][] values = new CellValue[2][7];

    public MyModel() {
        for(int i = 0; i < 2; i++) {
            for(int j=0; j < 7; j++) {
                values[i][j] = new CellValue(i + ":" + j);
            }
        }
    }

    @Override
    public int getColumnCount() {
        return 7;
    }

    @Override
    public int getRowCount() {
        return 2;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return values[rowIndex][columnIndex];
    }
}

Вот главный класс:

public class Main {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(500,500));

        final JTable table = new JTable(new MyModel());
        for(int i =0; i < 7; i++) {
            table.getColumnModel().getColumn(i).setCellRenderer(new tblCalendarRenderer());
        }

        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                int row = table.rowAtPoint(e.getPoint());
                int column = table.columnAtPoint(e.getPoint());

                Object obj = table.getValueAt(row, column);
                System.out.println("value " + obj);
                CellValue cellValue = (CellValue)obj;
                cellValue.highlightEnd++;
                table.repaint();
            }
        });
        table.setRowHeight(50);
        JScrollPane scp = new JScrollPane(table);
        frame.add(scp);
        frame.setVisible(true);
    }
}
...