Как в рендеринге столбца флажка с грязным маркером в JTable? - PullRequest
0 голосов
/ 08 марта 2010

Я пытаюсь показать маркер на столбцах флажков в JTable, чтобы указать, что значение грязное.

У меня проблемы с поиском способа визуализации маркера. Я попытался установить значок на JCheckbox, но это просто отображает значок вместо флажка. Я пытался использовать Panel, но она портит макет.

У кого-нибудь есть идеи, как лучше всего это сделать?

Спасибо

Это то, что я пробовал до сих пор:

import java.awt.Component;

import javax.swing.Icon;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;

public class DirtyCheckboxRenderer extends JCheckBox implements TableCellRenderer {

    private final Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);


    public DirtyCheckboxRenderer() {
        setHorizontalAlignment(SwingConstants.CENTER);
        setBorderPainted(true);
    }


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

        setForegroundColor(table, isSelected);
        setBackgroundColor(table, isSelected);
        setCheckboxState(value);
        setBorder(hasFocus);
        setDirtyMarkerIcon();

        return this;

    }


    private void setCheckboxState(Object value) {
        boolean checked = value != null && ((Boolean) value).booleanValue();
        setSelected(checked);
    }


    private void setBorder(boolean hasFocus) {
        if (hasFocus) {
            setBorder(UIManager.getBorder("Table.focusCellHighlightBorder"));
        } else {
            setBorder(this.noFocusBorder);
        }
    }


    private void setForegroundColor(JTable table, boolean isSelected) {
        if (isSelected) {
            setForeground(table.getSelectionForeground());
        } else {
            setForeground(table.getForeground());
        }
    }


    private void setBackgroundColor(JTable table, boolean isSelected) {

        if (isSelected) { 
            setBackground(table.getSelectionBackground());
        } else {
            setBackground(table.getBackground());
        }

    }

    private void setDirtyMarkerIcon() {
        boolean columnIsDirty = true; //TODO 

        if (columnIsDirty) {
            Icon icon = getDirtyMarkerIcon();
            setHorizontalTextPosition(SwingConstants.TRAILING);
            setIcon(icon);
        } else {
            setIcon(null);
        }

    }


    private Icon getDirtyMarkerIcon() {

        //TODO
        return null; //
    }


} 

Ответы [ 4 ]

2 голосов
/ 08 марта 2010

Если вы настаиваете на том, чтобы «грязный значок» отображался после флажка, вам придется использовать панель.

Чтобы избежать неправильной разметки столбца, всегда следует отображать значок, даже если это прозрачный значок-заполнитель.

1 голос
/ 08 марта 2010

Один удобный подход состоит в том, чтобы DirtyCheckboxRenderer реализовывал интерфейс Icon и делал setIcon(this) в конструкторе. Метод paintIcon() дает ссылку на компонент, а координаты x и y будут правильно отражать ваши настройки положения текста.

0 голосов
/ 08 марта 2010

Ну, простой способ - изменить текст флажка и поставить перед ним звездочку.

0 голосов
/ 08 марта 2010

JTable должен автоматически отображать флажок, если вы возвращаете Boolean в методе getColumnClass в TableModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...