2016-08-24 2 views
0

SCCEE здесь:Установка TableCellRenderer добавляет пустое значение на вершине списка значения `JComboBox`

import java.awt.EventQueue; 

import javax.swing.DefaultCellEditor; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableColumn; 

public class TC extends JFrame{ 
    public TC(){ 
     begin(); 
    } 
    private void begin(){ 
     setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     setTitle("nothing."); 
     String[] options = {"One", "Two", "Three"}; 
     JComboBox<String> combo = new JComboBox<>(options); 
     JTable table = new JTable(new Object[2][2], new String[]{"One", "Two"}); 
     TableColumn col0 = table.getColumnModel().getColumn(0); 
     col0.setCellEditor(new DefaultCellEditor(combo)); 

     class MyRender extends DefaultTableCellRenderer { 
      public MyRender() { 
      } 
      @Override 
      public void setValue(Object value) { 
       if (value instanceof JComboBox) { 
        setText(((JComboBox) value).getSelectedItem().toString()); 
       } 
      } 
     } 

     MyRender renderer = new MyRender(); 
     col0.setCellRenderer(renderer); 

     JScrollPane sp = new JScrollPane(table); 
     getContentPane().add(sp); 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable(){ 

      @Override 
      public void run() { 
       TC tc = new TC(); 

      } 

     }); 
    } 
} 

Моей проблема: установка TableCellRenderer делает комбо выбрать пустой вариант поверх всех других ценностей, никто не рассказывало это сделать. Пустая запись происходит из ниоткуда.

Как я могу сделать комбо, выберите «Один» в первый момент вместо «»? Что-то я пропустил при реализации пользовательского рендеринга ?? Я последовал здесь:

Oracle tutorial of How to Use Tables - Swing - Java SE

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

Show a JComboBox with custom editor and renderer, example from java2s.com

, но я по-прежнему путают.

ответ

1

Как я могу сделать комбо выбрать «один» вход в первый момент,

Это поведение по умолчанию. Данные из TableModel используются для выбора элемента в поле со списком при вызове редактора.

В разделе из учебника Swing на Using a ComboBox as an Editor содержится рабочий пример, показывающий, как это сделать.

комбо не отображается, пока не выберите его

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

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

Отъезд: How to make a JComboBox table editor have the design of an ordinary JComboBox? в течение нескольких различных реализаций возможного визуализатора:

  1. мой пример показывает, что использование реального выпадающий будет, как (я не люблю его) и
  2. принятый ответ показывает лучший рендерер. Возможно, вы захотите изменить пример, чтобы панель была рендерером с BorderLayout. Затем вы добавляете ярлык в LINE_START и значок к LINE_END, чтобы значок был больше похож на поле со списком со стрелкой вниз справа.

Edit:

, но в вашей ссылке, выпадающий список показывает первый вариант

Нет, это не так. Проверьте код еще раз. Нажмите вторую или третью строку, чтобы вызвать редактор, чтобы увидеть, какой элемент выбран.

Чтобы уточнить, что я сказал ранее.Элемент в поле со списком выбирается на основе данных в TableModel. Поскольку ваш TableModel пуст, нет элемента для выбора.

Поместите некоторые данные в TableModel. Пример из учебника Swing и два примера в ссылке, которую я предоставил вам, у вас есть данные в TableModel, поэтому они работают.

+0

Спасибо, а другой ответ очень хороший. Но я не понимаю, что сама ссылка, которую вы мне дали, это то, что я последовал при выполнении SCCEE, делая это: 'col0.setCellEditor (новый DefaultCellEditor (combo));', но в вашей ссылке combobox показывает первый вариант, но в моей, просто пустой поначалу. После нажатия «Один», это правильно. Итак, почему поведение по умолчанию не работает? – FaithReaper

+0

Что касается вашего ответа на другой вопрос, я видел более элегантный способ сделать это (показывая редактор combobox, как и должно быть, со стрелкой и всеми) во второй ссылке моего ответа. Итак, что меня смутило, заключается в том, что реализации пользовательского рендерера/редактора кажутся произвольными, вы можете делать все, что захотите, и есть только очень ограниченное руководство для нас, чтобы понять основную часть, и мы просто выбираем коды других здесь и там... – FaithReaper

0

Спасибо, Роб Кармик. Я больше не буду перекрестно размещать сообщения.

Я нашел проблему. В визуализатора по умолчанию я положил одну строку кода:

class MyComboBoxRenderer extends JComboBox implements TableCellRenderer { 
    public MyComboBoxRenderer(JComboBox&lt;String&gt; combo) { 
     super(combo.getModel()); 
    } 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 
     int row, int column) { 
//  setSelectedItem(value); // where lies the problem, will always be null. 
     return this; 
    } 
} 

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

В CodeRanch я отправляю это, и система принимает его как спам, я не знаю почему. Хотя я сам нашел свое решение, я принимаю вас за помощь.

Еще раз спасибо.