我想在键盘激活的JTable中有一个可编辑的JComboBox

问题描述

我希望能够跳入组合框单元格并在键入字母时激活弹出窗口。 我已经编写了一个小程序,在表中有一个组合框,也有一个独立的框。 表格的组合框是可编辑的,而独立组合框则不可编辑。
独立的组合框仅显示键入键时要合并到表组合框中的行为。 可以使用向下箭头键激活表格组合框弹出窗口,但我不知道如何通过键盘将其下拉。 不知道我想要什么甚至可能。预先感谢您的评论。...

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

public class Testtable {
    final private JTable table;
    final private JComboBox tblcombo;
    final private JComboBox pnlcombo;
        
    public Testtable() {
        String[] headings = { "Name","Country"};
        Object[][] data = new Object[][]{
            { "John","Canada" },{ "Mary","USA" },{ "Bob","UK" },{ "Joan","Ukraine" },{ "Mike","Mexico"}};
        
        table = new JTable(data,headings) {
            // Following needed to allow comboBox to allow editing without
            // clicking mouse.
            @Override
            public void changeSelection(int row,int column,boolean toggle,boolean extend) {
                super.changeSelection(row,column,toggle,extend);
                if (editCellAt(row,column)) {
                    Component editor = getEditorComponent();
                    editor.requestFocusInWindow();
                }
            }
        };
        table.setRowHeight(30);
        jtableheader header = table.getTableHeader();
        header.setForeground(Color.BLUE);
        
        String[] countries = {"","Canada","Mexico","Samoa","UK","Ukraine","USA"};
        tblcombo = new JComboBox(countries);
        tblcombo.setEditable(true); 
        pnlcombo = new JComboBox(countries);
        pnlcombo.setEditable(false);
        
        JFrame frame = new JFrame("Test ComboBoxes");
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        
        JPanel p = createPanel();
        frame.add(p);
        frame.pack();
        frame.setLocationRelativeto(null);
        frame.setVisible(true);
    }
    
    private JPanel createPanel() {
        BorderLayout layout = new BorderLayout();
        JPanel p = new JPanel(layout);
        
        TableCellRenderer renderer = new MyCellRenderer();
        for (int i = 0; i < table.getColumnCount(); i++) {
            String name = table.getColumnName(i);
            TableColumn column = table.getColumn(name);
            column.setCellRenderer(renderer);
            if (name.equals("Country")) {
                column.setCellEditor(new ComboEditor(tblcombo));
            }
        }
      
        JScrollPane jsp = new JScrollPane(table);
        jsp.setBorder(BorderFactory.createLineBorder(Color.BLUE,2));
        
        JPanel pnl = new JPanel(new FlowLayout());
        JTextField tf = new JTextField(15);
        pnl.add(tf);
        pnl.add(pnlcombo);
        
        p.add(pnl,BorderLayout.norTH);
        p.add(jsp,BorderLayout.CENTER);
        
        return p;
    }
        
    public static void setUIFont(javax.swing.plaf.FontUIResource f) {
        java.util.Enumeration keys = UIManager.getDefaults().keys();
        while (keys.hasMoreElements()) {
            Object key = keys.nextElement();
            Object value = UIManager.get(key);
            if (value instanceof javax.swing.plaf.FontUIResource) {
                UIManager.put (key,f);
            }
        }
    }

    public static void main(String[] args) {
        try {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        UIManager.getLookAndFeelDefaults()
                .put("ComboBox.noActionOnKeyNavigation",true);
        setUIFont(new javax.swing.plaf.FontUIResource(
                new Font("Tahoma",Font.PLAIN,20))); 
        } catch (Exception ex) {
            ex.printstacktrace();
        }

        SwingUtilities.invokelater(new Runnable() {

            @Override
            public void run() {
                new Testtable();
            }
        });
    }

public class MyCellRenderer  extends JLabel implements TableCellRenderer {
    
    public MyCellRenderer() {
        this.setopaque(true);
    }
    
    @Override
    public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int col) {
        
        setBackground(Color.white);
        setForeground(Color.black);

        if (isSelected) {
            setBackground(Color.decode("#f8f8f8"));
            setForeground(Color.black);
            
        }
        if (hasFocus) {
            setBackground(Color.decode("#e9e9e9"));
            setForeground(Color.blue);
        }
        
        if (value == null) {
            value = "";
        }
        setText(value.toString());
        return this;
    }    
}

public class ComboEditor extends AbstractCellEditor
        implements TableCellEditor {

    private final JComboBox cb;

    public ComboEditor(JComboBox comboBox) {
        cb = comboBox;

        // prevent action events from being fired when the up/down arrow keys
        // are used
        this.cb.putClientProperty("JComboBox.isTableCellEditor",Boolean.TRUE);

        // remove the editor's border - the cell itself already has one
        ((JComponent)cb.getEditor().getEditorComponent()).setBorder(null);
        
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,int column) {
        
        if (isSelected) {
            cb.setBackground(table.getSelectionBackground());
        } else {
            cb.setBackground(table.getSelectionForeground());
        }
        
        ComboBoxEditor editor = cb.getEditor();
        editor.setItem(value);
        editor.selectAll();
        cb.setSelectedItem(value);
        return cb;
    }
    
    @Override
    public Object getCellEditorValue() {
        Object item = cb.getSelectedItem();
        if (!hasItem(item)) {
            addItem(item);
        }
        return item;
    }

    private boolean hasItem(Object value) {
        for (int i = 0; i < cb.getItemCount(); i++) {
            if (cb.getItemAt(i).toString().equals(value.toString())) {
                return true;
            }
        }
        return false;
    }
    
    private void addItem(Object value) {
        for (int i = 0; i < cb.getItemCount(); i++) {
            if (value.toString().compareto(cb.getItemAt(i).toString()) <= 0) {
                cb.insertItemAt(value,i);
                return;
            }
        }
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)