Nach JTable Zelle setDefaultRenderer zu JTextArea wie die ausgewählten Zeile in JTextArea markieren

StackOverflow https://stackoverflow.com/questions/3170570

Frage

Das ist mein Renderer

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;
    }
}

Dies ist der Code, den ich ausprobiert, um die Zeile in JTextArea zu markieren. Wie kann ich es in jTable hinzufügen? Ich habe versucht, textField.addCaretListener (neu ExampleCaretListener ()) hinzufügen; Aber es wird noch ganze jTable Zelle auswählen.

    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);
        }

    }

}
War es hilfreich?

Lösung

Ich denke, dass der Inhalt jeder Zelle Datum Nummer, so bin ich nicht sicher, was Sie versuchen zu tun oder wo Sie haben tatsächlich mehrere Zeilen in einzelner Zelle. Meinen Sie die Tabellenzelle statt ganzer Zeile zur Auswahl? Wenn das ist, was Sie gemeint könnte man es tun, indem Sie die Zeile / Spalte Selektionsmodelle für die Tabelle zu ändern. Ist dies nicht der Fall ist bitte Ihr Problem eingrenzen und bieten eine komplette (gereinigt) Quellcode.

Edit:

Wie eugener sagte Renderer zieht einfach Ihre JTextArea innerhalb der Zelle als ein Bild basierend auf dem Wert für diese Zelle. Sie können jedoch Ihr eigenes Modell erstellen, die den Zustand der Zelle darzustellen (statt nur einen einzigen String-Wert Sie zum Beispiel MyModel verwenden kann, das String und einige zusätzlichen Daten enthält) Zelle und machte auf der Grundlage dieses Modell. Zum Beispiel: - Update Auswahl Start und Ende der Auswahl basierend auf der Mausposition für den spezifischen Zellwert können Sie Mausklicks (Anfügen Maus Zuhörer jtable) und ändern Sie dann den Zustand dieses Modell erkennen. Innerhalb getCellRenderer warf Wert auf Ihren Objekttyp (MyModel), die Auswahl Start und Ende der Auswahl-Daten enthält und es verwendet, Textbereich zu machen.

Hier ist der Beispielcode ist die Auswahl erhöht, wie Sie auf eine Zelle klicken (sollten Sie ändern es richtig caret Positionen zu setzen, basierend auf klickten Mausposition), Code ist verschmutzt (Sie es oben ein wenig reinigen sollte) aber funktioniert:

Einsatz dieses in der Zelle Renderer:

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");
}

Und hier ist die Probe 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];
    }
}

Hier ist eine Hauptklasse:

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);
    }
}

Andere Tipps

Der Renderer zieht einfach Ihre JTextArea innerhalb der Zelle als ein Bild. So markieren Sie den Text an die Arbeit geht nicht. Das einzige, was IMO arbeiten kann verwendet JEditorPane für Ihren Renderer mit Text Styling entsprechenden Teil davon zu markieren.

Lesen Sie mehr unter http: // java. sun.com/docs/books/tutorial/uiswing/components/editorpane.html#recap

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top