简体   繁体   English

过滤后获取值jtable(组合框多列上的jtable)

[英]Get value jtable after filter (jtable on combobox multiple column)

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

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: 如果我了解您要尝试执行的操作,则这是我对您的valueChanged()方法所做的更改:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM