2013-06-27 10 views
1

У меня есть JComboBox, используемый в качестве редактора в JTable. На картинке вы можете увидеть их в столбце с пометкой Produs. Я хотел бы использовать конструкцию автономного JComboBox в ячейках сетки, особенно в правой части поля со списком, где треугольник отсутствует в ячейках сетки, поэтому пользователь будет знать, что ячейки сетки являются комбинированными ящиками без нажмите на один из них. Как я могу применить дизайн JComboBox (IsBackFlush) к JComboBoxes в сетке?Как сделать редактор таблицы JComboBox иметь дизайн обычного JComboBox?

По существу, как я могу спроектировать comboBox2 на основе дизайна comboBox1? Благодарю.

cropped image

+1

1), пожалуйста, чтобы переписать этот вопрос, 2) для лучшей помощи скорее опубликовать [SSCCE] (http://sscce.org/), 3) короткий работоспособный, компилируемый только около утра вопроса, 4) дон «Не понимаю, что происходит, AFAIK JComboBox не имеет никакого представления – mKorbel

+1

, не уверен, что вы действительно имеете в виду _contains экземпляры JComboBox_, но если это так: неправильно иметь компоненты в таблице/модели, вместо этого есть данные, которые визуализируются/редактируются средством визуализации/editor, который предоставляет подходящий компонент – kleopatra

+0

mKorbel, я хотел бы, чтобы мои комбинированные поля в сетке выглядели как поле со списком вне сетки. По существу у нас есть два экземпляра jComboBox, и я хотел бы сделать второй вид первым. Клеопатра, экземпляры JComboBox являются редакторами ячеек, они не являются частью модели. Я поделился тем фактом, что экземпляры JComboBox для проектирования, которые выглядят как другие, находятся внутри JTable, только для справки. По существу, вопрос заключается в том, как сделать поле со списком похожим на другое поле со списком. Если у нас есть решение этого, я верю, что не будет проблем с применением решения для моих списков. –

ответ

4

Исходя из этого полного example в качестве общей системы отсчета, обратите внимание, как появление неотобранных клеток в колонке ITEM_COL происходит из-за default renderer. Кнопка со стрелкой, типичная для автономного JComboBox, появляется только при вызове редактора ячейки, например, путем нажатия на ячейку или нажатия Пробел, когда ячейка выбрана. Вы можете добавить треугольник в пользовательский рендерер:

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

Дополнение: более полный пример из-за @aterai видно here.

+0

спасибо, я попробую это. –

+0

С некоторыми небольшими изменениями в этом коде я, наконец, решил проблему. Я принимаю ваше решение (я уже его поддержал). Дополнительные вызовы: label.setHorizontalTextPosition (javax.swing.SwingConstants.LEFT); \t \t \t label.setHorizontalAlignment (javax.swing.SwingConstants.RIGHT); –

+0

+1, ярлык со стрелкой отображается лучше, чем фактическое поле со списком. – camickr

3

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

import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.ArrayList; 
import javax.swing.*; 
import javax.swing.border.*; 
import javax.swing.table.*; 

public class TableComboBoxByRow extends JFrame 
{ 
    List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3); 

    public TableComboBoxByRow() 
    { 
     // Create the editors to be used for each row 

     String[] items1 = { "Red", "Blue", "Green" }; 
     JComboBox comboBox1 = new JComboBox(items1); 
     DefaultCellEditor dce1 = new DefaultCellEditor(comboBox1); 
     editors.add(dce1); 

     String[] items2 = { "Circle", "Square", "Triangle" }; 
     JComboBox comboBox2 = new JComboBox(items2); 
     DefaultCellEditor dce2 = new DefaultCellEditor(comboBox2); 
     editors.add(dce2); 

     String[] items3 = { "Apple", "Orange", "Banana" }; 
     JComboBox comboBox3 = new JComboBox(items3); 
     DefaultCellEditor dce3 = new DefaultCellEditor(comboBox3); 
     editors.add(dce3); 

     // Create the table with default data 

     Object[][] data = 
     { 
      {"Color", "Red"}, 
      {"Shape", "Square"}, 
      {"Fruit", "Banana"}, 
      {"Plain", "Text"} 
     }; 
     String[] columnNames = {"Type","Value"}; 
     DefaultTableModel model = new DefaultTableModel(data, columnNames); 
     JTable table = new JTable(model) 
     { 
      // Determine editor to be used by row 
      public TableCellEditor getCellEditor(int row, int column) 
      { 
       int modelColumn = convertColumnIndexToModel(column); 

       if (modelColumn == 1 && row < 3) 
        return editors.get(row); 
       else 
        return super.getCellEditor(row, column); 
      } 
     }; 

     JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 
     table.getColumnModel().getColumn(1).setCellRenderer(new ComboBoxRenderer()); 
    } 

    class ComboBoxRenderer extends JComboBox implements TableCellRenderer 
    { 

     public ComboBoxRenderer() 
     { 
      setBorder(new EmptyBorder(0, 0, 0, 0)); 
     } 

     public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, 
      boolean hasFocus, int row, int column) 
     { 
//   setFocusable(false); 
      removeAllItems(); 
      addItem(value); 
      return this; 
     } 
    } 

    public static void main(String[] args) 
    { 
     TableComboBoxByRow frame = new TableComboBoxByRow(); 
     frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+1

+1 для проницательной альтернативы. – trashgod

+0

+1, это тоже приятное решение –