2012-11-02 112 views
1

参考Question!由abg和答案由mKorBel。使用J2s自动完成JTable [自动完成组合框]不工作

并使用J2s Auto Complete Combo Box

当我使用Item类而不是String作为ArrayList项目时,mKorBel对于我的案例在代码中不起作用。

Vector<Vector<String>> comboData=util.GetComboData(); 
    ArrayList<String> listSomeString =  util.GetListForComboBox(comboData); 
    Java2sAutoComboBox comboBox = new Java2sAutoComboBox(listSomeString); 
    comboBox.setDataList(listSomeString); 
    column.setCellEditor(new DefaultCellEditor(comboBox)); 

的代码功能GetListForComboBox如下

public ArrayList GetListForComboBox(Vector<Vector<String>> comboData) { 


    //Vector model = new Vector(); 

    ArrayList<Item_> listSomeString = new ArrayList<Item_>();   
    try { 

    String strdata; 
    for (int i = 0; i < comboData.size(); i++) { 
    String id = comboData.get(i).elementAt(0).toString(); 

    if (comboData.get(i).elementAt(1) != null) { 
     strdata = comboData.get(i).elementAt(1).toString(); 
    } else { 
     strdata = ""; 
    } 

    Item_ it = new Item_(id, strdata); 
    //model.addElement(it); 
    listSomeString.add(it); 
    } 

    } catch (Exception ex) { 
    ex.printStackTrace(); 
    } 


    return listSomeString; 
    } 

的代码ITEM_类是如下

  public class Item_  
    {  

    private String description; 
    private String id; 
    public Item_(String id,String description)   
    {    

    this.description = description;  
    this.id = id; 
    }   
    public String getId()   
    {    return id;   
    }   

    public String getDescription()  
    {    return description;   
    }   
    public String toString()   
    {    return description;   
    } 

    public void setDescription(String desc)  
    {    description=desc;   
    } 

    } 
+0

@mKorbel请再次发布第二个答案 –

+0

@mKorbel请重新发送您的脱字符号实现。我对发布的任何苛刻评论感到非常抱歉。我从你那里学到了很多东西。提前致谢。 –

回答

2

不知道,要创建一个HashMap的或MutableComboBoxModel,因为自动完成严格基于Array,必须更改构造函数

我对错误的好奇心(我能不能够模拟这个问题),从该代码呈现太(禁用comboBox.setRenderer(new ItemRenderer());

import java.awt.BorderLayout; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JList; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class TableRenderDemo extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public TableRenderDemo() { 
     super(new BorderLayout(5, 5)); 
     final JTable table = new JTable(new MyTableModel()); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.setFillsViewportHeight(true); 
     table.setRowHeight(20); 
     JScrollPane scrollPane = new JScrollPane(table); 
     initColumnSizes(table); 
     setUpSportColumn(table, table.getColumnModel().getColumn(2)); 
     add(scrollPane, BorderLayout.CENTER); 
     JButton resetButton = new JButton("Reset to default"); 
     resetButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < table.getRowCount(); i++) { 
        table.getModel().setValueAt("None of the above", i, 2); 
       } 
      } 
     }); 
     add(resetButton, BorderLayout.SOUTH); 
    } 

    private void initColumnSizes(JTable table) { 
     MyTableModel model = (MyTableModel) table.getModel(); 
     TableColumn column = null; 
     Component comp = null; 
     int headerWidth = 0; 
     int cellWidth = 0; 
     Object[] longValues = model.longValues; 
     TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer(); 
     for (int i = 0; i < 5; i++) { 
      column = table.getColumnModel().getColumn(i); 
      comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0); 
      headerWidth = comp.getPreferredSize().width; 
      comp = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, longValues[i], false, false, 0, i); 
      cellWidth = comp.getPreferredSize().width; 
      column.setPreferredWidth(Math.max(headerWidth, cellWidth)); 
     } 
    } 

    private void setUpSportColumn(JTable table, TableColumn sportColumn) { 
     ArrayList<String> listSomeString = new ArrayList<String>(); 
     listSomeString.add("Snowboarding"); 
     listSomeString.add("Rowing"); 
     listSomeString.add("Knitting"); 
     listSomeString.add("Speed reading"); 
     listSomeString.add("Pool"); 
     listSomeString.add("None of the above"); 
     JComboBox comboBox = new JComboBox(); 
     comboBox.addItem(new Item(1, "-")); 
     comboBox.addItem(new Item(2, "Snowboarding")); 
     comboBox.addItem(new Item(3, "Rowing")); 
     comboBox.addItem(new Item(4, "Knitting")); 
     comboBox.addItem(new Item(5, "Speed reading")); 
     comboBox.addItem(new Item(6, "Pool")); 
     comboBox.addItem(new Item(7, "None of the above")); 
     comboBox.setMaximumRowCount(3); 
     comboBox.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       JComboBox comboBox = (JComboBox) e.getSource(); 
       Item item = (Item) comboBox.getSelectedItem(); 
       System.out.println(item.getId() + " : " + item.getDescription()); 
      } 
     }); 
     comboBox.setRenderer(new ItemRenderer()); 
     sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 
     DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
     renderer.setToolTipText("Click for combo box"); 
     sportColumn.setCellRenderer(renderer); 
    } 

    class ItemRenderer extends BasicComboBoxRenderer { 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (value != null) { 
       Item item = (Item) value; 
       setText(item.getDescription().toUpperCase()); 
      } 
      if (index == -1) { 
       Item item = (Item) value; 
       setText("" + item.getId()); 
      } 
      return this; 
     } 
    } 

    class Item { 

     private int id; 
     private String description; 

     public Item(int id, String description) { 
      this.id = id; 
      this.description = description; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getDescription() { 
      return description; 
     } 

     @Override 
     public String toString() { 
      return description; 
     } 
    } 

    class MyTableModel extends AbstractTableModel { 

     private static final long serialVersionUID = 1L; 
     private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; 
     private Object[][] data = {{"Kathy", "Smith", "Snowboarding", new Integer(5), false}, 
      {"John", "Doe", "Rowing", new Integer(3), true}, {"Sue", "Black", "Knitting", new Integer(2), false}, 
      {"Jane", "White", "Speed reading", new Integer(20), true}, {"Joe", "Brown", "Pool", new Integer(10), false}}; 
     public final Object[] longValues = {"Jane", "Kathy", "None of the above", new Integer(20), Boolean.TRUE}; 

     @Override 
     public int getColumnCount() { 
      return columnNames.length; 
     } 

     @Override 
     public int getRowCount() { 
      return data.length; 
     } 

     @Override 
     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      return data[row][col]; 
     } 

     @Override 
     public Class<?> getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      if (col < 2) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

     @Override 
     public void setValueAt(Object value, int row, int col) { 
      data[row][col] = value; 
      fireTableCellUpdated(row, col); 
      System.out.println("New value of data: " + getValueAt(row, col)); 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("TableRenderDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     TableRenderDemo newContentPane = new TableRenderDemo(); 
     frame.setContentPane(newContentPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

但是这段代码没有解决讨论的问题,即使用autoComplete ComboBox Java2sAutoComboBox(listSomeString); @mKorbel –

+0

运行http://stackoverflow.com/reputation,推到底部的按钮,clean_up你的用户配置文件(你失去了所有的声望,从删除的帖子后面31天???) – mKorbel

+0

我该怎么做? –

1

有插入符打(快速实现插入符,不好意思太懒惰,不任何想法),否则所有的编辑器中选中,退格键选择第一个项目默认

import java.awt.BorderLayout; 
import javax.swing.DefaultCellEditor; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import java.awt.Component; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.util.ArrayList; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFormattedTextField; 
import javax.swing.JList; 
import javax.swing.JTextField; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 
import javax.swing.text.JTextComponent; 

public class TableRenderDemo extends JPanel { 

    private static final long serialVersionUID = 1L; 

    public TableRenderDemo() { 
     super(new BorderLayout(5, 5)); 
     final JTable table = new JTable(new MyTableModel()); 
     table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.setFillsViewportHeight(true); 
     JScrollPane scrollPane = new JScrollPane(table); 
     initColumnSizes(table); 
     setUpSportColumn(table, table.getColumnModel().getColumn(2)); 
     add(scrollPane, BorderLayout.CENTER); 
     JButton resetButton = new JButton("Reset to default"); 
     resetButton.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       for (int i = 0; i < table.getRowCount(); i++) { 
        table.getModel().setValueAt("None of the above", i, 2); 
       } 
      } 
     }); 
     add(resetButton, BorderLayout.SOUTH); 
    } 

    private void initColumnSizes(JTable table) { 
     MyTableModel model = (MyTableModel) table.getModel(); 
     TableColumn column = null; 
     Component comp = null; 
     int headerWidth = 0; 
     int cellWidth = 0; 
     Object[] longValues = model.longValues; 
     TableCellRenderer headerRenderer = table.getTableHeader().getDefaultRenderer(); 
     for (int i = 0; i < 5; i++) { 
      column = table.getColumnModel().getColumn(i); 
      comp = headerRenderer.getTableCellRendererComponent(null, column.getHeaderValue(), false, false, 0, 0); 
      headerWidth = comp.getPreferredSize().width; 
      comp = table.getDefaultRenderer(model.getColumnClass(i)).getTableCellRendererComponent(table, longValues[i], false, false, 0, i); 
      cellWidth = comp.getPreferredSize().width; 
      column.setPreferredWidth(Math.max(headerWidth, cellWidth)); 
     } 
    } 

    private void setUpSportColumn(JTable table, TableColumn sportColumn) { 
     ArrayList<String> listSomeString = new ArrayList<String>(); 
     listSomeString.add("-"); 
     listSomeString.add("Snowboarding"); 
     listSomeString.add("Rowing"); 
     listSomeString.add("Knitting"); 
     listSomeString.add("Speed reading"); 
     listSomeString.add("Pool"); 
     listSomeString.add("None of the above"); 
     AutoComboBox comboBox = new AutoComboBox(listSomeString); 
     comboBox.setDataList(listSomeString); 
     comboBox.setMaximumRowCount(3); 
     comboBox.addActionListener(new ActionListener() { 

      public void actionPerformed(ActionEvent e) { 
       JComboBox comboBox = (JComboBox) e.getSource(); 
       System.out.println(comboBox.getSelectedItem()); 
      } 
     }); 
     JTextComponent editor = ((JTextField) comboBox.getEditor().getEditorComponent()); 
     editor.setCaretPosition(editor.getCaretPosition()); 
     editor.moveCaretPosition(0); 
     editor.addFocusListener(focsListener); 

     sportColumn.setCellEditor(new DefaultCellEditor(comboBox)); 
     DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 
     renderer.setToolTipText("Click for combo box"); 
     sportColumn.setCellRenderer(renderer); 
    } 

    private FocusListener focsListener = new FocusListener() { 

     @Override 
     public void focusGained(FocusEvent e) { 
      dumpInfo(e); 
     } 

     @Override 
     public void focusLost(FocusEvent e) { 
      //dumpInfo(e); 
     } 

     private void dumpInfo(FocusEvent e) { 
      //System.out.println("Source : " + name(e.getComponent())); 
      //System.out.println("Opposite : " + name(e.getOppositeComponent())); 
      //System.out.println("Temporary: " + e.isTemporary()); 
      final Component c = e.getComponent(); 
      if (c instanceof JFormattedTextField) { 
       EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         ((JFormattedTextField) c).requestFocus(); 
         ((JFormattedTextField) c).setText(((JFormattedTextField) c).getText()); 
         ((JFormattedTextField) c).selectAll(); 
        } 
       }); 
      } else if (c instanceof JTextField) { 
       EventQueue.invokeLater(new Runnable() { 

        public void run() { 
         ((JTextField) c).requestFocus(); 
         ((JTextField) c).setText(((JTextField) c).getText()); 
         ((JTextField) c).selectAll(); 
        } 
       }); 
      } 
     } 

     private String name(Component c) { 
      return (c == null) ? null : c.getName(); 
     } 
    }; 

    class ItemRenderer extends BasicComboBoxRenderer { 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, 
       int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (value != null) { 
      } 
      if (index == -1) { 
      } 
      return this; 
     } 
    } 

    class MyTableModel extends AbstractTableModel { 

     private static final long serialVersionUID = 1L; 
     private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; 
     private Object[][] data = {{"Kathy", "Smith", "Snowboarding", new Integer(5), false}, 
      {"John", "Doe", "Rowing", new Integer(3), true}, {"Sue", "Black", "Knitting", new Integer(2), false}, 
      {"Jane", "White", "Speed reading", new Integer(20), true}, {"Joe", "Brown", "Pool", new Integer(10), false}}; 
     public final Object[] longValues = {"Jane", "Kathy", "None of the above", new Integer(20), Boolean.TRUE}; 

     @Override 
     public int getColumnCount() { 
      return columnNames.length; 
     } 

     @Override 
     public int getRowCount() { 
      return data.length; 
     } 

     @Override 
     public String getColumnName(int col) { 
      return columnNames[col]; 
     } 

     @Override 
     public Object getValueAt(int row, int col) { 
      return data[row][col]; 
     } 

     @Override 
     public Class<?> getColumnClass(int c) { 
      return getValueAt(0, c).getClass(); 
     } 

     @Override 
     public boolean isCellEditable(int row, int col) { 
      if (col < 2) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

     @Override 
     public void setValueAt(Object value, int row, int col) { 
      data[row][col] = value; 
      fireTableCellUpdated(row, col); 
      System.out.println("New value of data: " + getValueAt(row, col)); 
     } 
    } 

    private static void createAndShowGUI() { 
     JFrame frame = new JFrame("TableRenderDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     TableRenderDemo newContentPane = new TableRenderDemo(); 
     frame.setContentPane(newContentPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 
+0

我在绑定到组合框的动作事件上发生错误,因为有时候由于上次关注的行而导致更改发生错误值。 @mKorbel –

+0

JComboBox comboBox =(JComboBox)e.getSource(); System.out.println(comboBox.getSelectedItem()); String itemStr = comboBox.getSelectedItem()。toString(); int selectedRowLocal = tblDetailInfoParts.getSelectedRow(); @mKorbel 如果(selectedRowLocal = -1!){ 如果((itemStr = NULL)&&(itemStr.compareTo( “”)= 0)!){ tblDetailInfoParts.setValueAt(itemStr,selectedRowLocal,15); } –

+0

因此在选定的行上设置了错误的值@mKorbel –

0

我知道这是一个老问题,但在情况下,它可以帮助一个人在那里,这里是如何做的OP问:

在Java2sAutoCombobox中,将函数setSelectedValue(对象OBJ)由这一个代替:

void setSelectedValue(String str) 
{ 
    if(!isFired) 
    { 
     Object objectToSelect = null; 

     for(Object obj: getDataList()) 
     { 
      if(obj.toString().equals(str)) 
      { 
       objectToSelect = obj; 
       break; 
      } 
     } 

     isFired = true; 
     setSelectedItem(objectToSelect); 
     fireItemStateChanged(new ItemEvent(this, 701, selectedItemReminder, 
              1)); 
     isFired = false; 
    } 
} 

通过这样做,JComboBox.setSelectedItem()将选择从数据列表,而不是它的字符串表示的对象。