Как помешать отдельному столбцу переупорядочиваться в JTable?

Главным образом я видел, что это раньше кодировало двоичные данные в контекстах, которые могут только обработать ASCII - или простое - наборы символов.

14
задан Michael Myers 20 July 2009 в 18:35
поделиться

5 ответов

Я считаю, что вам нужно переопределить метод columnMoved () в TableColumnModelListener . в классе TableColumnModelEvent есть метод getFromIndex () , который вы должны иметь возможность посмотреть, чтобы определить, является ли это вашим фиксированным столбцом, а затем вы сможете отменить событие.

Надеюсь, что это поможет. A

3
ответ дан 1 December 2019 в 13:34
поделиться

Сначала вам нужно определить лучший и простой способ. Что вам не нравится в подходе с двумя таблицами?

Вы не можете использовать TableColumnModelListener, потому что событие запускается «после» того, как столбец уже был перемещен.

Код для перетаскивания столбца находится в BasicTableHeaderUI. Таким образом, вы можете попробовать переопределить код там, но тогда вам нужно будет сделать это для всех LAF.

Приведенный выше код вызывает JTableHeader.getReorderingAllowed () для события mousePressed, чтобы определить, разрешено ли переупорядочение столбцов. Я предполагаю, что вы могли бы переопределить этот метод в JTableHeader и, возможно, использовать класс MouseInfo, чтобы получить текущее местоположение мыши, чтобы определить, было ли оно над первым столбцом, а затем вернуть false. Но теперь вам также нужно будет создать настраиваемую таблицу JTable, которая использует настраиваемый заголовок таблицы.

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

Таблица с фиксированными столбцами - моя версия того, как это будет реализовано с двумя таблицами. Это лучше? Я не знаю,

2
ответ дан 1 December 2019 в 13:34
поделиться

У меня была такая же проблема, и я искал ее. На данный момент я нашел два способа сделать это.

  • Метод «если бы я переписывал это сам» : ​​изменение базовых классов из Java.

TableColumn потребовало бы нового свойства, например " resizingAllowed ", для этого потребуется" reorderingAllowed ". Из этого изменения происходят в BasicTableHeaderUI :

Уже есть:

private static boolean canResize(TableColumn column,
                                 JTableHeader header) {
    return (column != null) && header.getResizingAllowed()
                            && column.getResizable();
}

Также потребуется:

private static boolean canMove(TableColumn column,
                               JTableHeader header) {
    return (column != null) && header.getReorderingAllowed()
                                && column.getReorderable();
}

(Обратите внимание, что если вы не хотите, чтобы только первый столбец не перемещался , вы можете обойтись без изменения TableColumns:

private static boolean canMove(TableColumn column,
                                 JTableHeader header) {
    return (column != null) && header.getReorderingAllowed()
                            && header.getColumnModel().getColumnIndex(column.getIdentifier()) != 0;
}

)

После, два места для изменения в MouseInputListener :

  • в mousePressed , вызывая canMove () вместо header.getReorderingAllowed () . Это гарантирует, что столбец, который нельзя перемещать, не будет.
  • Но этого недостаточно, нам нужно предотвратить перемещение неподвижных столбцов во время перетаскивания другого. Вам также необходимо изменить mouseDragged , когда он получает "newColumnIndex":

    if (0

Вам необходимо добавить условие, если этот новый индекс можно переместить, например, с помощью метода «canMove ()». Таким образом, когда вы перетаскиваете столбец в этот неподвижный, вы все равно перетаскиваете его, но он не меняет их местами.

Обратите внимание, что этот метод потребует от вас явной установки пользовательского интерфейса для JTableHeader, используемого для вашего JTable , что не совсем идеально. Но это наиболее адаптированный вариант, поскольку он решает проблему там, где должен.


  • Метод «Давайте попробуем заблокировать нормальное поведение тем, что у нас есть на самом деле» : без изменения пользовательского интерфейса, этот метод фокусируется на JTableHeader, чтобы заблокировать команды, сделанные пользовательским интерфейсом.

Во-первых, чтобы заблокировать перетаскивание первого столбца, нам нужен подкласс из JTableHeader с этим переопределенным методом:

@Override
public void setDraggedColumn(TableColumn pAColumn)
{
    int lIndex  = -1;
    if (pAColumn != null)
        lIndex = getColumnModel().getColumnIndex(pAColumn.getIdentifier());
    if (lIndex != 0)
        super.setDraggedColumn(pAColumn);
}

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

Пока у меня нет правильного метода для этого. Я попытался создать подкласс TableColumnModel и переопределить метод moveColumn () :

@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
    //Move only if the first column is not concerned
    if (pColumnIndex =! 0 && pNewIndex != 0)
        super.moveColumn(pColumnIndex, pNewIndex);
}

Но это не сработает, поскольку пользовательский интерфейс все равно обновит положение мыши в методе mouseDragged , у вас будет прыжок из перетаскиваемой колонки в другое место.

Итак, я все еще ищу и интересуюсь, есть ли у кого-нибудь предложения по этой части.

У меня нет правильного метода для этого. Я попытался создать подкласс TableColumnModel и переопределить метод moveColumn () :

@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
    //Move only if the first column is not concerned
    if (pColumnIndex =! 0 && pNewIndex != 0)
        super.moveColumn(pColumnIndex, pNewIndex);
}

Но это не сработает, поскольку пользовательский интерфейс все равно обновит положение мыши в методе mouseDragged , у вас будет прыжок из перетаскиваемой колонки в другое место.

Итак, я все еще ищу и интересуюсь, есть ли у кого-нибудь предложения по этой части.

У меня нет правильного метода для этого. Я попытался создать подкласс TableColumnModel и переопределить метод moveColumn () :

@Override
public void moveColumn(int pColumnIndex, int pNewIndex)
{
    //Move only if the first column is not concerned
    if (pColumnIndex =! 0 && pNewIndex != 0)
        super.moveColumn(pColumnIndex, pNewIndex);
}

Но это не сработает, поскольку пользовательский интерфейс все равно обновит положение мыши в методе mouseDragged , у вас будет прыжок из перетаскиваемой колонки в другое место.

Итак, я все еще ищу и интересуюсь, есть ли у кого-нибудь предложения по этой части.

1
ответ дан 1 December 2019 в 13:34
поделиться

Я использовал подход «Попробуем заблокировать нормальное поведение тем, что у нас есть на самом деле». Гноупи сказал, что он не решил вторую часть задачи. Вот решение только для Windows XP L&F:

  1. скопируйте класс XPStyle себе.
  2. расширьте WindowsTableHeaderUI . Взгляните на исходный код .
  3. используйте его: getTableHeader (). SetUI (new TreeTableWindowsTableHeaderUI ());

Спасибо Gnoupi за усилия .

0
ответ дан 1 December 2019 в 13:34
поделиться

Это решение, которое я использовал, чтобы предотвратить переупорядочение 1-го столбца

private int columnValue = -1; 
private int columnNewValue = -1; 


tblResults.getColumnModel().addColumnModelListener(new TableColumnModelListener() 
{ 
    public void columnAdded(TableColumnModelEvent e) {} 

    public void columnMarginChanged(ChangeEvent e) {} 

    public void columnMoved(TableColumnModelEvent e) 
    { 
        if (columnValue == -1) 
            columnValue = e.getFromIndex(); 

        columnNewValue = e.getToIndex(); 
    } 

    public void columnRemoved(TableColumnModelEvent e) {} 

    public void columnSelectionChanged(ListSelectionEvent e) {} 
}); 

tblResults.getTableHeader().addMouseListener(new MouseAdapter() 
{ 
    @Override 
    public void mouseReleased(MouseEvent e) 
    { 
        if (columnValue != -1 && (columnValue == 0 || columnNewValue == 0)) 
        tblResults.moveColumn(columnNewValue, columnValue); 

        columnValue = -1; 
        columnNewValue = -1; 
    } 
}); 

Ура,

7
ответ дан 1 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: