2013-11-17 2 views
0

я написал эту простую программу:JTable, JComboBox - проблемы показывая JComboBox во втором столбце

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class JcomboboxJtableDemo extends JPanel 
          implements ActionListener { 

    private DefaultTableModel tableModel; 
    JTable table = new JTable (tableModel); 
    private JScrollPane scrollpaneTable = new JScrollPane(table); 
    private JPanel PaneBottoniTabella = new JPanel(); 

    public JcomboboxJtableDemo() { 
     super(new BorderLayout()); 

     String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; 

     JComboBox comboBox = new JComboBox(petStrings); 
     comboBox.setSelectedIndex(4); 

     tableModel = CreateTableModel(); 

     tableModel.insertRow(0, new Object[] {"Header col1", ""}); 
     tableModel.insertRow(0, new Object[] {petStrings[0], ""}); 
     tableModel.insertRow(0, new Object[] {petStrings[1], ""}); 
     tableModel.insertRow(0, new Object[] {petStrings[2], ""}); 
     tableModel.insertRow(0, new Object[] {petStrings[3], ""}); 
     tableModel.setValueAt("Header col2", 0, 1); 

     DefaultCellEditor editor = new DefaultCellEditor(comboBox); 
     table.getColumnModel().getColumn(0).setCellEditor(editor); 
     table.getColumnModel().getColumn(1).setCellEditor(editor); 



     //Lay out the demo. 
     add(comboBox, BorderLayout.PAGE_START); 
     add(table, BorderLayout.PAGE_END); 
     setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); 
    } 


    private final DefaultTableModel CreateTableModel() { 
    DefaultTableModel modello = new DefaultTableModel(new Object[] { "Col1","Col2" }, 0) { 
     @Override 
     public boolean isCellEditable(int row, int column) { 
      return true; 
     } 
    }; 
    table.setModel(modello); 
     return modello; 
    } 

    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("ComboBoxDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     JComponent newContentPane = new JcomboboxJtableDemo(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 
    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

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

Не могли бы вы рассказать мне, почему? Как я могу решить проблему?

Благодаря

ответ

2

Вы используете один и тот же компонент JComboBox для обеих ColumnModel колонн, которые в свою очередь имеют одинаковые ComboBoxModel. Любое изменение выбранного элемента из одного столбца будет отражено в другом столбце. Создайте второй combobox

JComboBox comboBox2 = new JComboBox(petStrings); 
... 
table.getColumnModel().getColumn(1).setCellEditor(editor2); 

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

+0

ОК, но это не сработает, я до сих пор не вижу элементов компонента JComboBox во втором столбце. Кроме того, есть способ назначить другой компонент JComboBox для каждой ячейки. Является ли это возможным? – Frank

+0

Используя код в вопросе, элементы отображаются как ожидалось, как в выпадающем списке, так и в таблице, поэтому нельзя реплицировать это без дополнительной информации. Переписывая другой комбинированный блок, вы можете переопределить 'getCellEditor' (но похоже, что он перебор) – Reimeus

+0

да, извините, вы правы, это работает спасибо – Frank

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