Как я могу сосредоточиться на целый ряд JTable? - PullRequest
1 голос
/ 31 марта 2011

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

ОБНОВЛЕНИЕ: Это мой текущий код моего пользовательского TableCellRenderer, проблема в том, что когда строка имеет фокус и окрашивается в цвет "фокус", а затем JTable теряет фокус , только ячейка , которая имела фокус, перекрашивается в «выбранный» цвет, но все ячейки в выбранной строке следует перекрашивать в «выбранный» цвет.

@Override
public Component getTableCellRendererComponent(JTable table,
        Object value, boolean isSelected, boolean hasFocus,
        int row, int column) {

    // Has any cell in this row focus?
    if(table.getSelectedRow() == row && table.hasFocus()) {
        hasFocus = true;
    }

    if (hasFocus) {
        this.setBackground(CustomColors.focusedColor);
    } else if (isSelected) {
        this.setBackground(CustomColors.selectedColor);
    } else {

        // alternate the color of every second row
        if(row % 2 == 0) {
            this.setBackground(Color.WHITE);
        } else {
            this.setBackground(CustomColors.grayBg);
        }
    }

    setValue(value);

    return this;

}

Ответы [ 2 ]

2 голосов
/ 31 марта 2011
1 голос
/ 31 марта 2011

Первой идеей будет что-то вроде

JTable jTable = new JTable() {
    public TableCellRenderer getCellRenderer(int row, int column) {
        final TableCellRenderer superRenderer = super.getCellRenderer(row, column);
        return new TableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object object, boolean isSelected, boolean hasFocus, int row, int column) {
                // determine focus on row attribute only
                hasFocus = hasFocus() && isEnabled() && getSelectionModel().getLeadSelectionIndex() == row;
                return superRenderer.getTableCellRendererComponent(table, object, isSelected, hasFocus, row, column);
            }
        };
    }
};

где я использую свою собственную логику для определения фокуса только на основе атрибута строки. Он использует базовые средства визуализации ячеек, но выглядит странно, если используется граница фокуса.

...