2012-02-03 30 views
5

Tôi đang cố gắng tạo cột trong JXTable làm hộp tổ hợp. Khó giải thích vấn đề tôi đang gặp phải. Khi bạn nhấp vào menu thả xuống, đôi khi trình đơn thả xuống không mở đủ lâu để bạn có thể chọn giá trị. Nó chỉ đóng và một số giá trị được chọn. Đôi khi nó vẫn mở để bạn chọn một giá trị. Đây là SSCCE:Sự cố với JComboBox trong JXTable

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

Bạn có thể sao chép sự cố với 'JTable' không? –

+3

@AndrewThompson yeah, cùng một vấn đề. Không phải là giải pháp, chỉ là một phần mềm (không liên quan): không sử dụng cùng một thể hiện của comboBoxModel trong cả trình kết xuất và trình chỉnh sửa - trình chỉnh sửa sẽ nghe vĩnh viễn mô hình có thể dẫn đến các hiệu ứng lạ, thậm chí có thể làm hỏng dữ liệu – kleopatra

+0

Hmm ... trông giống như một biến thể của một trong những lỗi lâu đời nhất trong Swing (không có id, quá lười biếng để tìm kiếm trong cuộc diễu hành nổi tiếng chậm chạp lỗi) mà tôi nghĩ đã được sửa: xảy ra với một JTable lõi, mặc định cốt lõi (label) renderer và comboEditor mặc định lõi - trên lần nhấp đầu tiên vào ô, popup đôi khi được hiển thị và đôi khi không hiển thị (mặc dù bảng luôn ở trạng thái chỉnh sửa, afaics) – kleopatra

Trả lời

1

Để giải quyết vấn đề này chắc chắn rằng bạn không chia sẻ cùng một ví dụ của DefaultComboxBoxModel cho trình biên tập và renderer .. Vì vậy, thay vì điều này:

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

Làm điều này:

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

[tốt hơn sẽ được xem tại đây] (http://stackoverflow.com/a/9709633/714968) – mKorbel