1

You can copy the search in combobox test run and after the filter selected it still get the original value. You can see my code and complete the data received after the data filtering help me, more than a week searching but could not do it. hope you help. Thank you very much

Form.java:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.JTextField;
public class Form implements Runnable {
    private static JFrame frame;
    private static DetailedComboBox combo;
    private static JTextField textField;
    private static DetailedComboBox comboLop;
    private static JTextField textField2;
    /**
     * @wbp.parser.entryPoint
     */
    @Override
    public void run() {
        // TODO Auto-generated method stub



        List<List<?>> tableData = new ArrayList<List<?>>();
        tableData.add(new ArrayList<String>(
                Arrays.asList("0","Nam", "Phan Nam", "1")));
        tableData.add(new ArrayList<String>(
                    Arrays.asList( "1","Long", "Dinh Hoang Long", "2")));
        tableData.add(new ArrayList<String>(
                Arrays.asList( "3","Luc", "Phan Cong Luc", "4")));
        tableData.add(new ArrayList<String>(
                Arrays.asList( "4","Hoang", "Tran Hoang", "5")));



        String[] columns = new String[]{"ID","Name", "Full Name", "Capital"};
        int[] widths = new int[]{0,80, 200, 100};

        combo = new DetailedComboBox(columns, widths, 0);
        combo.setEditable(true);
      //  comboNhanVien.setEditable(true);
        combo.setBounds(58, 50, 154, 23);
        combo.setTableData(tableData);
        combo.setSelectedIndex(-1);
        combo.setPopupAlignment(DetailedComboBox.Alignment.LEFT);
        combo.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            showDetails();
          }

        });
      /*  combo.getEditor().getEditorComponent().addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(FocusEvent arg0) {
                combo.showPopup();
                combo.hidePopup();
            }
            @Override
            public void focusLost(FocusEvent arg0) {
                //combo.hidePopup();
            }
        });*/
        combo.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                 System.out.print(e.getKeyCode());
                String value= combo.getEditor().getItem().toString();

                 if (value.trim().length() == 0 && e.getKeyCode() != 40) {
                     combo.hidePopup();
                    // System.out.print(e.getKeyCode());
                }else {
                    combo.showPopup();
                    //System.out.print("X: "+e.getKeyCode());
                }
            }             
        });

        List<List<?>> tableDataLop = new ArrayList<List<?>>();
        tableDataLop.add(new ArrayList<String>(
                Arrays.asList("0","Class A")));
        tableDataLop.add(new ArrayList<String>(
                 Arrays.asList("1","Class B")));

        String[] columnsLop = new String[]{"ID","Class"};
        int[] widthsLop = new int[]{0,100};

        comboLop = new DetailedComboBox(columnsLop, widthsLop, 0);
        comboLop.setEditable(true);
      //  comboNhanVien.setEditable(true);
        comboLop.setBounds(58, 50, 154, 23);
        comboLop.setTableData(tableDataLop);
        comboLop.setSelectedIndex(-1);
        comboLop.setPopupAlignment(DetailedComboBox.Alignment.LEFT);
        comboLop.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent e)
          {
            showDetailsLop();
          }

        });
        comboLop.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                 System.out.print(e.getKeyCode());
                String value= comboLop.getEditor().getItem().toString();

                 if (value.trim().length() == 0 && e.getKeyCode() != 40) {
                     comboLop.hidePopup();
                    // System.out.print(e.getKeyCode());
                }else {
                    comboLop.showPopup();
                    //System.out.print("X: "+e.getKeyCode());
                }
            }             
        });
        comboLop.setEditable(true);
        comboLop.setBounds(58, 94, 154, 23);



        JPanel p = new JPanel();
        p.setLayout(null);
        p.add(combo);
        p.add(comboLop);
         frame = new JFrame();
            frame.setBounds(100, 100, 450, 300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(p, BorderLayout.CENTER);
            p.add(getTextField());
            p.add(getTextField2());
        //frame.getContentPane().setLayout(null);
        //frame.getContentPane().add(comboNhanVien);
            //frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
    }
    /**
     * Launch the application.
     */

    /**
     * Create the application.
     */

     private static void showDetails()
      {
        List<? extends Object> rowData = combo.getSelectedRow();
        textField.setText(rowData.get(1).toString());
       // capital.setText(rowData.get(2).toString());

      }
     public static void main(String[] args)
      {
        SwingUtilities.invokeLater(new Form());
      }
    private JTextField getTextField() {
        if (textField == null) {
            textField = new JTextField();
            textField.setBounds(234, 52, 86, 20);
            textField.setColumns(10);
        }
        return textField;
    }
    private JTextField getTextField2() {
        if (textField2 == null) {
            textField2 = new JTextField();
            textField2.setColumns(10);
            textField2.setBounds(234, 96, 86, 20);
        }
        return textField2;
    }
     private static void showDetailsLop()
      {
        List<? extends Object> rowData = comboLop.getSelectedRow();
        textField2.setText(rowData.get(1).toString());
       // capital.setText(rowData.get(2).toString());
      }
}

and DetailedComboBox.java

import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.plaf.basic.*;
import javax.swing.plaf.metal.*;
import javax.swing.table.*;


/**
 * A JComboBox that has a JTable as a drop-down instead of a JList
 */
@SuppressWarnings({ "rawtypes", "serial" })
public class DetailedComboBox extends JComboBox
{
  public static enum Alignment {LEFT, RIGHT}

  private List<List<? extends Object>> tableData;
  private String[] columnNames;
  private int[] columnWidths;
  private Alignment popupAlignment = Alignment.LEFT;
/**
   * Construct a TableComboBox object
   */
  public DetailedComboBox(String[] colNames, int[] colWidths,
                          int displayColumnIndex)
  {
    super();
    this.columnNames = colNames;
    this.columnWidths = colWidths;
    setUI(new TableComboBoxUI());
    setEditable(false);
  }

  /**
   * Set the type of alignment for the popup table
   */
  public void setPopupAlignment(Alignment alignment)
  {
    popupAlignment = alignment;
  }

  /**
   * Populate the combobox and drop-down table with the supplied data.
   * If the supplied List is non-null and non-empty, it is assumed that
   * the data is a List of Lists to be used for the drop-down table.
   * The combobox is also populated with the column data from the
   * column defined by <code>displayColumn</code>.
   */
  @SuppressWarnings("unchecked")
public void setTableData(List<List<? extends Object>> tableData)
  {
    this.tableData = (tableData == null ?
        new ArrayList<List<? extends Object>>() : tableData);

    // even though the incoming data is for the table, we must also
    // populate the combobox's data, so first clear the previous list.
    removeAllItems();

    // then load the combobox with data from the appropriate column
    Iterator<List<? extends Object>> iter = this.tableData.iterator();
    while (iter.hasNext())
    {
      List<? extends Object> rowData = iter.next();

     // System.out.print(rowData.get(1));
      addItem(rowData.get(1));
      // addItem(rowData.get(displayColumn));
    }
  }

  public List<? extends Object> getSelectedRow()
  {
      List<? extends Object> data = null;

    if(tableData.get(getSelectedIndex()) != null){
        data=tableData.get(getSelectedIndex());
      }
    System.out.println(data);
    return data;
  }

  /**
   * The handler for the combobox's components
   */
  private class TableComboBoxUI extends MetalComboBoxUI
  {
    /**
     * Create a popup component for the ComboBox
     */
    @Override
    protected ComboPopup createPopup()
    {
      return new TableComboPopup(comboBox, this);
    }

    /**
     * Return the JList component
     */
    public JList getList()
    {
      return listBox;
    }
  }

  /**
   * The drop-down of the combobox, which is a JTable instead of a JList.
   */
  private class TableComboPopup extends BasicComboPopup
      implements ListSelectionListener, ItemListener
  {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private final JTable table;

    private TableComboBoxUI comboBoxUI;
    private PopupTableModel tableModel;
    private JScrollPane scroll;
//    private JList list = new JList();
//    private ListSelectionListener selectionListener;
//    private ItemListener itemListener;

    private void selectRow()
    {
      int index = comboBox.getSelectedIndex();

      if (index != -1)
      {
        int idc=table.getRowCount();
        if(idc>0){
            //System.out.println("idc "+idc);
            //table.setRowSelectionInterval(index, index);
            //table.scrollRectToVisible(table.getCellRect(index, 0, true));

        }
      }
    }
    /**
     * Construct a popup component that's a table
     */
    public TableComboPopup(JComboBox combo, TableComboBoxUI ui)
    {
      super(combo);
      this.comboBoxUI = ui;


      tableModel = new PopupTableModel();
      table = new JTable(tableModel);
      table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
      table.getTableHeader().setReorderingAllowed(false);

      TableColumnModel tableColumnModel = table.getColumnModel();
      tableColumnModel.setColumnSelectionAllowed(false);

      for (int index = 0; index < table.getColumnCount(); index++)
      {
        TableColumn tableColumn = tableColumnModel.getColumn(index);
        tableColumn.setPreferredWidth(columnWidths[index]);
      }
      table.removeColumn(table.getColumnModel().getColumn(0));

      scroll = new JScrollPane(table);
      scroll.setHorizontalScrollBarPolicy(
          JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
      scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

      ListSelectionModel selectionModel = table.getSelectionModel();
      selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
      selectionModel.addListSelectionListener(this);
      combo.addItemListener(this);

      table.addMouseListener(new MouseAdapter()
      {
        public void mousePressed(MouseEvent event)
        {
         // java.awt.Point p = event.getPoint();
         // int row = table.rowAtPoint(p);
          //int row = table.convertRowIndexToModel(table.getEditingRow());
          //System.out.println("row 2: "+row);
        ///  comboBox.setSelectedIndex(row);
          //comboBox.getEditor().setItem("Text Has Changed");
          hide();
        }
      });

      table.setBackground(UIManager.getColor("ComboBox.listBackground"));
      table.setForeground(UIManager.getColor("ComboBox.listForeground"));
    }

    /**
     * This method is overridden from BasicComboPopup
     */
    @Override
    public void show()
    {
      if (isEnabled())
      {
        super.removeAll();

        int scrollWidth = table.getPreferredSize().width +
            ((Integer) UIManager.get("ScrollBar.width")).intValue() + 1;
        int scrollHeight = comboBoxUI.getList().
                           getPreferredScrollableViewportSize().height;
        scroll.setPreferredSize(new Dimension(scrollWidth, scrollHeight));

        super.add(scroll);

        ListSelectionModel selectionModel = table.getSelectionModel();
        selectionModel.removeListSelectionListener(this);
        selectRow();
        selectionModel.addListSelectionListener(this);

        int scrollX = 0;
        int scrollY = comboBox.getBounds().height;

        if (popupAlignment == Alignment.RIGHT)
        {
          scrollX = comboBox.getBounds().width - scrollWidth;
        }

        show(comboBox, scrollX, scrollY);
       // table.setRowSelectionInterval(0, 0);

        comboBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {

                String value= comboBox.getEditor().getItem().toString();
                //System.out.println("value: " +value);
                TableRowSorter<TableModel> rowSorter
                = new TableRowSorter<>(table.getModel());

                table.setRowSorter(rowSorter);
               if (value.trim().length() == 0) {
                    rowSorter.setRowFilter(null);
                    table.setRowSelectionInterval(0, 0);
               }else {
                   rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" + value,1));
                   int index = comboBox.getSelectedIndex();

                   if (index != -1)
                   {
                    int idc=table.getRowCount();
                    if(idc>0){
                        //System.out.println("idc "+idc);
                        //table.setRowSelectionInterval(index, index);
                        //table.scrollRectToVisible(table.getCellRect(index, 0, true));
                    }
                   }
               }
            }
        });
      }

    }

    /**
     * Implemention of ListSelectionListener
     */
    public void valueChanged(ListSelectionEvent event)
    {
        int index = table.getSelectedRow();
        int row = table.convertRowIndexToView(table.getEditingRow());
        System.out.println("B "+row);
        if (index != -1)
        {
            //System.out.print("B "+index);
            comboBox.setSelectedIndex(table.getSelectedRow());
        }
    }

    @Override
    public void itemStateChanged(ItemEvent arg0) {
        // TODO Auto-generated method stub

    }
  }

  /**
   * A model for the popup table's data
   */
  private class PopupTableModel extends AbstractTableModel
  {
    /**
     * Return the # of columns in the drop-down table
     */
    public int getColumnCount()
    {
      return columnNames.length;
    }

    /**
     * Return the # of rows in the drop-down table
     */
    public int getRowCount()
    {
      return tableData == null ? 0 : tableData.size();
    }

    /**
     * Determine the value for a given cell
     */
    public Object getValueAt(int row, int col)
    {
      if (tableData == null || tableData.size() == 0)
      {
        return "";
      }

      return tableData.get(row).get(col);
    }

    /**
     * All cells in the drop-down table are uneditable
     */
    @Override
    public boolean isCellEditable(int row, int col)
    {
      return false;
    }

    /**
     * Pull the column names out of the tableInfo object for the header
     */
    @Override
    public String getColumnName(int column)
    {
      String columnName = null;

      if (column >= 0 && column < columnNames.length)
      {
        columnName = columnNames[column].toString();
      }

      return (columnName == null) ? super.getColumnName(column) : columnName;
    }
  }
}
user2911607
  • 33
  • 1
  • 5
  • Please provide more details, what output you expect? what this app do? – m.cekiera Aug 09 '15 at 16:46
  • *"You can see my code and complete the data received after the data filtering help me, more than a week searching but could not do it."* While we could finish the code for you, that is not what SO is about. It is a Q&A site for which the question "Can you finish my code?" is off topic as being 'too broad'. For better help sooner, post a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/) & actually show what you tried, and explain why that attempt failed. – Andrew Thompson Aug 09 '15 at 16:48
  • `p.setLayout(null);` Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or [combinations of them](http://stackoverflow.com/a/5630271/418556) along with layout padding and borders for [white space](http://stackoverflow.com/a/17874718/418556). – Andrew Thompson Aug 09 '15 at 16:49
  • `after the filter selected it still get the original value.` - filtering data in a JTable does not remove the data from the TableModel. It only filters the data that is displayed in the View of the JTable. If you only want data from the table then use `table.getValueAt(...)` NOT table.getModel().getValueAt(...). – camickr Aug 09 '15 at 17:28
  • before I get the right data filters selected lines, but after I did it, filter it get wrong data, you may take some time to run code on help me with. thank you. – user2911607 Aug 09 '15 at 17:52
  • You can see the video will understand what I am encountering errors http://youtu.be/NU5MouQf0-c – user2911607 Aug 09 '15 at 18:06
  • Tip: Add @camickr (or whoever, the `@` is important) to *notify* the person of a new comment. – Andrew Thompson Aug 09 '15 at 18:47

1 Answers1

1

You need to be aware of the model/view index relationship between the combo box, table and model.

Your combo box will always have all the entries so its index is equivalent to the model index.

The table may be filtered or not so you need to convert its index to the model index so you can set the combo box index.

If I understand what you are attempting to do then this is the change I made to your valueChanged() method:

public void valueChanged(ListSelectionEvent event)
{
    int index = table.getSelectedRow();

    if (index != -1)
    {
        int row = table.convertRowIndexToModel(index);
        comboBox.setSelectedIndex(row);
    }
}
camickr
  • 321,443
  • 19
  • 166
  • 288
  • Thank you. I have done according to your instructions, your java beginners should not understand this language. Again thank you more – user2911607 Aug 10 '15 at 01:09