2013-02-21 2 views
0

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

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

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

+1

Итак, вы изменили рабочий код, и теперь он не работает. Может быть, проблема связана с измененным кодом? Поскольку вы не опубликовали свой [SSCCE] (http://sscce.org/), мы не можем догадаться, что вы могли бы сделать. – camickr

+0

Ну, я понял, что редактирование было достаточно простым, и это было бы трудно понять ... Я в основном изменил «DefaultTableModel model = new DefaultTableModel (data, columnNames));' to' DefaultTableModel model = new DefaultTableModel (columnNames); 'и затем сделал' model.addRow(); 'чтобы поместить элементы в таблицу после создания таблицы. Я бы не подумал, что это сильно отличается от создания таблицы так, как они были, а затем обновляя ее позже разными данными. – DGolberg

+0

Ничем не отличается. Не имеет значения, обновлена ​​ли модель с помощью метода addRow(). – camickr

ответ

1

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

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

или вы можете настроить Renderer по умолчанию, как в примере this.

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 доступен для просмотра. Я использовал второй пример, результат можно увидеть here.

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

+0

Добавлены значительные части ссылок. – Adalars1

+0

Это было так давно, что я задал этот вопрос, что я забыл, что именно я собираюсь использовать для него (в конце концов, я пошел с альтернативным методом), но ваш второй вариант, по крайней мере, обеспечивает подходящую работу -around, который показывает, что поле отличается от остальных, поэтому вы можете ожидать другого ответа при нажатии на него. Спасибо! – DGolberg

2

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

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

Для получения дополнительной информации ознакомьтесь с разделом из учебника Swing по телефону Using Custom Renderers.

+0

Я предполагаю, что неправильно это сформулировал ... Увидеть это как строку в порядке, на самом деле желательно, но я даже не вижу этого, пока не выбрал ячейку, а затем переключился на другую. Ячейка просто показывается пустой до тех пор. – DGolberg

+0

Хм, я просто подумал о работе, но это кажется немного странным способом сделать это ... Во всяком случае, когда я обновляю таблицу (получаю данные/новые данные для отображения в ней), я просто установил значение в этой ячейке, чтобы отобразить выбранный элемент со списком: 'projDTM.setValueAt (cbItems.getSelectedItem(), z, 1);' Есть ли лучший способ сделать это или это предназначенный метод? – DGolberg

+0

Не нужно «работать». – camickr

Смежные вопросы