过滤后获得值jtable(在组合框多列上jtable)

时间:2015-08-09 16:36:57

标签: java swing combobox jtable

您可以在组合框测试运行中复制搜索,并在选择过滤器后仍然获得原始值。 您可以看到我的代码并完成数据过滤后帮助我收到的数据,超过一周的搜索但无法完成。希望你能帮忙。非常感谢你

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

和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;
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您需要了解组合框,表和模型之间的模型/视图索引关系。

您的组合框将始终包含所有条目,因此其索引等同于模型索引。

表可能已过滤或未过滤,因此您需要将其索引转换为模型索引,以便设置组合框索引。

如果我了解您尝试执行的操作,那么这是我对您的valueChanged()方法所做的更改:

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

    if (index != -1)
    {
        int row = table.convertRowIndexToModel(index);
        comboBox.setSelectedIndex(row);
    }
}