2012-02-03 63 views
5

我正在試圖將JXTable中的列設置爲組合框。它很難解釋我面臨的問題。當你點擊下拉菜單時,下拉菜單不會保持足夠長的時間來選擇該值。它只是關閉,並選擇了一些價值。有時它保持開放供您選擇一個值。 這裏的SSCCE:JXTable中的JComboBox問題

import java.awt.Color; 

import javax.swing.ComboBoxModel; 
import javax.swing.DefaultCellEditor; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JComboBox; 
import javax.swing.table.DefaultTableModel; 

import org.jdesktop.swingx.JXFrame; 
import org.jdesktop.swingx.JXTable; 
import org.jdesktop.swingx.renderer.CellContext; 
import org.jdesktop.swingx.renderer.ComponentProvider; 
import org.jdesktop.swingx.renderer.DefaultTableRenderer; 

public class Test { 

    public static void main(String[] args) { 
     JXFrame frame=new JXFrame(); 
     Object[][] rows = new Object[10][]; 

     for (int i = 0; i < rows.length; i++) { 
     rows[i] = new Object[]{ 
     "Test data ","Yes"}; 
     } 

     DefaultTableModel model = new DefaultTableModel(rows, 
     new String[]{ 
     "Title 1", "Title 2" 
     }); 

     final JXTable table = new JXTable(model); 
     DefaultComboBoxModel cmodel = new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"}); 
     table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(cmodel))); 
     table.getColumnExt(1).setCellEditor(new ComboBoxEditor(cmodel)); 
     table.setVisibleRowCount(10); 
    frame.setContentPane(table); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class ComboBoxEditor extends DefaultCellEditor { 
    public ComboBoxEditor(ComboBoxModel model) { 
     super(new JComboBox(model)); 
    } 
} 

class ComboBoxProvider extends ComponentProvider<JComboBox> { 
    private static final long serialVersionUID = 1L; 
    private JComboBox box; 
    public ComboBoxProvider(ComboBoxModel model){ 
     box.setModel(model); 
    } 
    @Override 
    protected void configureState(CellContext context) { 
     box.setForeground(Color.black); 
    } 
    @Override 
    protected JComboBox createRendererComponent() { 
     box = new JComboBox(); 
     box.setForeground(Color.black); 
     return box; 
    } 
    @Override 
    protected void format(CellContext context) { 
     box.setForeground(Color.black); 
     rendererComponent.setSelectedItem(context.getValue()); 
    } 
} 
+0

你可以用'JTable'來複制問題嗎? – 2012-02-03 06:35:28

+3

@AndrewThompson是的,同樣的問題。不是一個解決方案,只是一個(不相關的)小心:不要在渲染器和編輯器中使用相同的comboBoxModel實例 - 編輯器會永久地聽到可能導致奇怪效果的模型,甚至可能破壞數據 – kleopatra 2012-02-03 07:10:46

+0

嗯......看起來像是Swing中最老的bug之一(沒有id,懶得在臭名昭着的bug遊行中搜索),我認爲這是被修正的:發生在覈心JTable,核心默認(標籤)渲染器和核心默認組合編輯器 - 首先點擊進入單元格,彈出窗口有時會顯示,有時不顯示(儘管表格總是處於編輯狀態,afaics) – kleopatra 2012-02-03 07:28:07

回答

1

爲了解決這個問題,確保你不分享DefaultComboxBoxModel的同一個實例爲編輯器和渲染器..所以不是這樣的:

DefaultComboBoxModel cmodel = new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"}); 
    table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(cmodel))); 
    table.getColumnExt(1).setCellEditor(new ComboBoxEditor(cmodel)); 

這樣做:

table.getColumnExt(1).setCellRenderer(new DefaultTableRenderer(new ComboBoxProvider(
      new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"})))); 
    table.getColumnExt(1).setCellEditor(new ComboBoxEditor(
      new DefaultComboBoxModel(new String[] {"Yes","No","Maybe"}))); 
+0

[更好的是這裏看看](http://stackoverflow.com/a/9709633/714968) – mKorbel 2012-03-25 19:52:57