Nano Hash - криптовалюты, майнинг, программирование

Java JComboBox в таблице не отображается до нажатия ячейки

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

Мой вопрос: как мне заставить его отображать выбранное значение в JComboBox без необходимости сначала выбирать ячейку?

edit: одна вещь, о которой я забыл, это упоминание; вместо того, чтобы объявлять DefaultTableModel data заранее, как у них, элементы вместо этого добавляются в DTM позже, используя model.addRow();

21.02.2013

  • Итак, вы изменили рабочий код, и теперь он не работает. Может проблема в модифицированном коде? Поскольку вы не опубликовали свой SSCCE, мы не можем предположить, что вы могли сделать. 22.02.2013
  • Что ж, я подумал, что редактирование было достаточно простым, чтобы было не так сложно разобраться... Я в основном изменил DefaultTableModel model = new DefaultTableModel(data, columnNames); на DefaultTableModel model = new DefaultTableModel(columnNames);, а затем сделал model.addRow();, чтобы поместить элементы в таблицу после создания таблицы. Я не думаю, что это сильно отличается от создания таблицы так, как они потом обновляли ее позже с другими данными. 22.02.2013
  • Это ничем не отличается. Не имеет значения, обновляется ли модель с помощью метода addRow(). 22.02.2013

Ответы:


1

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

public void example(){  

    TableColumn tmpColum =table.getColumnModel().getColumn(1);
    String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" };
    JComboBox comboBox = new JComboBox(DATA);

    DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox);
    tmpColum.setCellEditor(defaultCellEditor);
    tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox));
    table.repaint();
}


/**
   Custom class for adding elements in the JComboBox.
*/
class CheckBoxCellRenderer implements TableCellRenderer {
    JComboBox combo;
    public CheckBoxCellRenderer(JComboBox comboBox) {
    this.combo = new JComboBox();
    for (int i=0; i<comboBox.getItemCount(); i++){
        combo.addItem(comboBox.getItemAt(i));
    }
    }
    public Component getTableCellRendererComponent(JTable jtable, 
                           Object value, 
                           boolean isSelected, 
                           boolean hasFocus, 
                           int row, int column) {
    combo.setSelectedItem(value);
    return combo;
    }
}

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

final JComboBox combo = new JComboBox(items);
TableColumn col = table.getColumnModel().getColumn(ITEM_COL);
col.setCellRenderer(new DefaultTableCellRenderer(){
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
                               boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel label = (JLabel) super.getTableCellRendererComponent(table,
                                    value, isSelected, hasFocus, row, column);
        label.setIcon(UIManager.getIcon("Table.descendingSortIcon"));
        return label;
    }
    });

В первом примере ячейка после щелчка выглядит как JComboBox. Во втором примере к JComboCox добавляется значок стрелки, который показывает, что JComboBox можно щелкнуть. Я использовал второй пример, результат можно увидеть здесь.

07.11.2014
  • Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. 07.11.2014
  • Добавлены значительные части ссылок. 07.11.2014
  • Прошло так много времени с тех пор, как я задавал этот вопрос, что я забыл, для чего я собирался его использовать (я полагаю, что в конце концов я выбрал альтернативный метод), но ваш второй вариант, по крайней мере, обеспечивает подходящую работу - вокруг этого показывает, что поле отличается от остальных, поэтому вы можете ожидать другого ответа при нажатии на него. Спасибо! 07.11.2014

  • 2

    Это нормальное поведение. Таблица использует визуализаторы и редакторы. Средство визуализации по умолчанию для ячейки — это просто JLabel, поэтому все, что вы видите, — это текст. Когда вы нажимаете на ячейку, вызывается редактор, поэтому вы видите поле со списком.

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

    Прочтите раздел руководства Swing по Использование пользовательских средств визуализации. Чтобы получить больше информации.

    21.02.2013
  • Думаю, я неправильно сформулировал это ... Видеть это как строку - это нормально, на самом деле желательно, но я даже не вижу этого, пока не выберу ячейку, а затем переключусь на другую. Ячейка просто выглядит пустой до тех пор. 22.02.2013
  • Хм, я только что подумал об обходном пути, но это кажется немного странным способом сделать это... Во всяком случае, когда я обновляю таблицу (получаю данные/новые данные для отображения в ней), я просто устанавливаю значение в этой ячейке, чтобы отобразить выбранный элемент поля со списком: projDTM.setValueAt(cbItems.getSelectedItem(), z, 1); Есть ли лучший способ сделать это или это предполагаемый метод? 22.02.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..