2012-02-03 9 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」の問題を再現できますか? –

+3

@AndrewThompsonええ、同じ問題。解決策ではなく、レンダラとエディタの両方でcomboBoxModelの同じインスタンスを使用しないでください。エディタは恒久的にモデルをリッスンしています。奇妙な結果につながり、データを破損する可能性があります。 – kleopatra

+0

うーん...スイングで最も古いバグのひとつの変種のように見えます(idを持たない、悪名高いバグパレードで検索するにはあまりにも怠惰です)、修正されたと思います。コアJTable、コアのデフォルト(ラベル)レンダラーとコアのデフォルトのコンボエディタ - 最初にセルをクリックすると、ポップアップが表示され、時には表示されないことがあります(テーブルは常に編集状態にありますが、afaics) – kleopatra

答えて

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