我正在寻找在Java swing中创建带有多个过滤器的搜索栏。
我想得出以下结果。
https://image.noelshack.com/fichiers/2019/08/2/1550565354-cj3db.png)
不幸的是,我尝试用自动完成功能编辑一个jcombobox,但是我无能为力。
有人进行过这样的开发吗?或者他们能够给我带来前进的线索吗?
先谢谢您
答案 0 :(得分:0)
不是我最好的作品。也许您可以以此为起点?
public class JTextFieldWithMenu extends JFrame implements DocumentListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private JTextField entry;
private JLabel jLabel1;
private JPopupMenu popup;
public JTextFieldWithMenu() {
initComponents();
entry.getDocument().addDocumentListener(this);
}
private void initComponents() {
entry = new JTextField(40);
entry.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
}
@Override
public void focusGained(FocusEvent e) {
entry.setSelectionStart(0);
entry.setSelectionEnd(0);
entry.setCaretPosition(entry.getText().length());
}
});
jLabel1 = new JLabel();
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setTitle("TextFieldDemo");
jLabel1.setText("Enter text to search:");
setLayout(new BorderLayout());
add(jLabel1, BorderLayout.WEST);
add(entry, BorderLayout.CENTER);
pack();
}
public void insertUpdate(DocumentEvent ev) {
showPopup();
}
protected void showPopup() {
if (popup != null)
popup.setVisible(false);
popup = null;
if (entry.getText().length() == 0)
return;
popup = new JPopupMenu();
popup.setRequestFocusEnabled(false);
if (entry.getText().length() == 0) {
popup.setVisible(false);
} else {
popup.removeAll();
popup.add(new JMenuItem("Search for '" + entry.getText() + "' in Filter1"));
popup.add(new JMenuItem("Search for '" + entry.getText() + "' in Filter2"));
popup.add(new JMenuItem("Search for '" + entry.getText() + "' in Filter3"));
if (!popup.isShowing())
popup.show(entry, 0, entry.getHeight());
else
popup.revalidate();
entry.requestFocus();
}
}
public void removeUpdate(DocumentEvent ev) {
showPopup();
}
public void changedUpdate(DocumentEvent ev) {
showPopup();
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTextFieldWithMenu().setVisible(true);
}
});
}
}
答案 1 :(得分:0)
谢谢
https://i.stack.imgur.com/5sqay.png
JTable_Search.java
package JAVA_VIDEOS_TUTORIALS;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
import javax.swing.GroupLayout.Alignment;
import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.GroupLayout;
import javax.swing.JList;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.JPopupMenu;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class JTable_Search extends javax.swing.JFrame implements DocumentListener {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger("fr.pasteque.pos.caching.LocalDB");
private static Connection conn = null;
public ArrayList<CustomData> ListArray = new ArrayList<CustomData>();
/**
* Creates new form JTable_Search
*/
public JTable_Search() {
initComponents();
jText_Search.getDocument().addDocumentListener(this);
// call findUsers function
findUsers();
}
// function to connect to mysql database
private static Connection getConnection() throws SQLException {
if (conn == null) {
try {
Class.forName("org.h2.Driver");
String url = "jdbc:h2:???";
conn = DriverManager.getConnection(url, "", "");
} catch (ClassNotFoundException e) {
// Should never happen
logger.log(Level.SEVERE,
"Unable to run local cache database", e);
}
}
return conn;
}
// function to return users arraylist with particular data
public ArrayList<User> ListUsers(String ValToSearch)
{
ArrayList<User> usersList = new ArrayList<User>();
String searchQuery = "SELECT * FROM customers WHERE id like '%%'";
Statement st;
ResultSet rs;
try{
if (ValToSearch.length()!=0) {
String[] items = ValToSearch.split(";");
List<String> ValToSearchByCol = Arrays.asList(items);
for( int i = 0; i < ValToSearchByCol.size(); i++)
{
if (ValToSearchByCol.get(i).indexOf("firstname") == 0) {
String searchFirstname = ValToSearchByCol.get(i).replace("firstname:", "");
System.out.println(searchFirstname);
searchQuery += "AND LOWER(firstname) like LOWER('"+searchFirstname+"%')";
}
else if (ValToSearchByCol.get(i).indexOf("lastname") == 0) {
String searchLastname = ValToSearchByCol.get(i).replace("lastname:", "");
System.out.println(searchLastname);
searchQuery += "AND LOWER(lastname) like LOWER('"+searchLastname+"%')";
}
else {
System.out.println(ValToSearchByCol.get(i));
JOptionPane.showMessageDialog(null, "Veuillez saisir une valeur dans le champ recherche.", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
}
Connection con = getConnection();
st = con.createStatement();
rs = st.executeQuery(searchQuery);
User user;
while(rs.next())
{
user = new User(
rs.getString("id"),
rs.getString("firstname"),
rs.getString("lastname"),
rs.getString("name")
);
usersList.add(user);
}
}catch(Exception ex){
System.out.println(ex.getMessage());
}
return usersList;
}
// function to display data in jtable
public void findUsers()
{
ArrayList<User> users = ListUsers(jText_Search.getText());
DefaultTableModel model = new DefaultTableModel();
model.setColumnIdentifiers(new Object[]{"ID","Firstname","Lastname","Name"});
Object[] row = new Object[4];
for(int i = 0; i < users.size(); i++)
{
row[0] = users.get(i).getId();
row[1] = users.get(i).getFirstname();
row[2] = users.get(i).getLastname();
row[3] = users.get(i).getName();
model.addRow(row);
}
jTable_Users.setModel(model);
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jPanel2 = new javax.swing.JPanel();
jButton_Search = new javax.swing.JButton();
jText_Search = new javax.swing.JTextField();
jScrollPane1 = new javax.swing.JScrollPane();
jTable_Users = new javax.swing.JTable();
JList_Search = new javax.swing.JList<CustomData>();
jText_Search.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
}
@Override
public void focusGained(FocusEvent e) {
jText_Search.setSelectionStart(0);
jText_Search.setSelectionEnd(0);
jText_Search.setCaretPosition(jText_Search.getText().length());
}
});
jPopupMenu_Search = new javax.swing.JPopupMenu();
addPopup(jText_Search, jPopupMenu_Search);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jButton_Search.setText("Search");
jButton_Search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton_SearchActionPerformed(evt);
}
});
jText_Search.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
jTable_Users.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
jTable_Users.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
},
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
}
));
jScrollPane1.setViewportView(jTable_Users);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addGap(27)
.addGroup(jPanel2Layout.createParallelGroup(Alignment.LEADING)
.addComponent(JList_Search, GroupLayout.PREFERRED_SIZE, 416, GroupLayout.PREFERRED_SIZE)
.addGroup(jPanel2Layout.createParallelGroup(Alignment.TRAILING, false)
.addGroup(jPanel2Layout.createSequentialGroup()
.addComponent(jText_Search)
.addGap(103)
.addComponent(jButton_Search))
.addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, 584, GroupLayout.PREFERRED_SIZE)))
.addContainerGap(30, Short.MAX_VALUE))
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(Alignment.LEADING)
.addGroup(jPanel2Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel2Layout.createParallelGroup(Alignment.BASELINE)
.addComponent(jButton_Search)
.addComponent(jText_Search, GroupLayout.PREFERRED_SIZE, 32, GroupLayout.PREFERRED_SIZE))
.addGap(47)
.addComponent(JList_Search, GroupLayout.DEFAULT_SIZE, 105, Short.MAX_VALUE)
.addGap(45)
.addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addGap(75))
);
jPanel2.setLayout(jPanel2Layout);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addComponent(jPanel2, GroupLayout.DEFAULT_SIZE, 641, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jPanel2, GroupLayout.PREFERRED_SIZE, 717, GroupLayout.PREFERRED_SIZE)
.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
getContentPane().setLayout(layout);
pack();
}// </editor-fold>
////DEBUT #1
/** PG: Fonction qui crée un PopupMenu en dessous du JTextField avec comme MenuItems
* toutes les informations recherchables sur l'utilisateur + le text saisie dans le JTextField
*/
protected void showPopup() {
if (jPopupMenu_Search != null)
jPopupMenu_Search.setVisible(false);
jPopupMenu_Search = null;
if (jText_Search.getText().length() == 0)
return;
jPopupMenu_Search = new JPopupMenu();
jPopupMenu_Search.setRequestFocusEnabled(false);
if (jText_Search.getText().length() == 0) {
jPopupMenu_Search.setVisible(false);
} else {
jPopupMenu_Search.removeAll();
//DEBUT #2
/** PG: Rempli le PopupMenu avec comme MenuItems toutes les informations recherchables sur l'utilisateur,
* en se basant sur la classe Search_User qui contient toutes les informations recherchables sur un utilisateur
* et en concaténant dans les MenueItems ces informations + le texte saisi dans le JTextField
*/
Search_User seacrch_user = new Search_User(jText_Search.getText());
for (int i = 0; i < seacrch_user.getInfoUser().size(); i++) {
JMenuItem item=new JMenuItem(seacrch_user.getInfoUser().get(i) + seacrch_user.getSerachValue());
//DEBUT #3
/** PG: Action lorsqu'on clique sur un MenuItems, on copie la valeur du MenuItems dans le
* JList et on vide le JTextField
*/
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ListArray.add(new CustomData(item.getText()));
DefaultListModel<CustomData> model = new DefaultListModel<CustomData> ();
for (int y=0; y<ListArray.size();y++) {
model.addElement(ListArray.get(y));
}
JList_Search.setModel(model);
JList_Search.setCellRenderer(new CustomListRenderer(JList_Search,ListArray));
JList_Search.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
JList_Search.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JList_Search.setLayoutOrientation(JList.HORIZONTAL_WRAP);
JList_Search.setVisibleRowCount(-1);
jText_Search.setText("");
}
//FIN #3
});
jPopupMenu_Search.add(item);
}
//FIN #2
if (!jPopupMenu_Search.isShowing())
jPopupMenu_Search.show(jText_Search, 0, jText_Search.getHeight());
else
jPopupMenu_Search.revalidate();
jText_Search.requestFocus();
}
}
//FIN #1
public void insertUpdate(DocumentEvent ev) {
showPopup();
}
public void removeUpdate(DocumentEvent ev) {
showPopup();
}
public void changedUpdate(DocumentEvent ev) {
showPopup();
}
// Button Filter/search
private void jButton_SearchActionPerformed(java.awt.event.ActionEvent evt) {
if (jText_Search.getText().length()==0) {
JOptionPane.showMessageDialog(null, "Veuillez saisir une valeur dans le champ recherche.", "Attention", JOptionPane.WARNING_MESSAGE);
}
else {
findUsers();
}
}
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException ex) {
java.util.logging.Logger.getLogger(JTable_Search.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(JTable_Search.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(JTable_Search.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(JTable_Search.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JTable_Search().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JButton jButton_Search;
private javax.swing.JPanel jPanel2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable_Users;
private javax.swing.JTextField jText_Search;
private javax.swing.JList<CustomData> JList_Search;
private javax.swing.JPopupMenu jPopupMenu_Search;
private static void addPopup(Component component, final JPopupMenu popup) {
component.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
showMenu(e);
}
}
private void showMenu(MouseEvent e) {
popup.show(e.getComponent(), e.getX(), e.getY());
}
});
}
}
Search_User.java
package JAVA_VIDEOS_TUTORIALS;
import java.util.Arrays;
import java.util.List;
public class Search_User {
private List<String> infoUser;
private String serachValue;
public Search_User(String SerachValue)
{
this.infoUser = Arrays.asList("Prénom: ", "Nom: ");
this.serachValue = SerachValue;
}
public List<String> getInfoUser() {
return infoUser;
}
public void setInfoUser(List<String> infoUser) {
this.infoUser = infoUser;
}
public String getSerachValue() {
return serachValue;
}
public void setSerachValue(String serachValue) {
this.serachValue = serachValue;
}
}
User.java
package JAVA_VIDEOS_TUTORIALS;
public class User {
private String id;
private String firstname;
private String lastname;
private String name;
public User(String Id,String Firstname,String Lastname,String Name)
{
this.id = Id;
this.firstname = Firstname;
this.lastname = Lastname;
this.name = Name;
}
public String getId()
{
return id;
}
public String getFirstname()
{
return firstname;
}
public String getLastname()
{
return lastname;
}
public String getName()
{
return name;
}
}
CustomListRenderer.java
package JAVA_VIDEOS_TUTORIALS;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.SwingUtilities;
/**
* @author Mikle Garin
* @see http://stackoverflow.com/a/18589264/909085
*/
public class CustomListRenderer extends DefaultListCellRenderer
{
/**
*
*/
private static final long serialVersionUID = 1L;
private static final ImageIcon crossIcon = new ImageIcon ("src/cross.png");
/**
* Actual renderer.
*/
private CustomLabel renderer;
/**
* Custom renderer constructor.
* We will use it to create actual renderer component instance.
* We will also add a custom mouse listener to process close button.
*
* @param list our JList instance
*/
public CustomListRenderer(final JList<CustomData>list, ArrayList<CustomData> listArrayList)
{
super();
renderer = new CustomLabel();
list.addMouseListener(new MouseAdapter()
{
@Override
public void mouseReleased(MouseEvent e)
{
if ( SwingUtilities.isLeftMouseButton(e))
{
int index = list.locationToIndex(e.getPoint());
if (index != -1 && list.isSelectedIndex(index))
{
Rectangle rect = list.getCellBounds(index, index);
Point pointWithinCell = new Point (e.getX() - rect.x, e.getY() - rect.y);
Rectangle crossRect = new Rectangle(rect.width-rect.width+5,
rect.height/2-12/2,12, 12);
if (crossRect.contains(pointWithinCell))
{
DefaultListModel<CustomData> model = (DefaultListModel<CustomData>)list.getModel();
model.remove(index);
listArrayList.remove(index);
}
}
}
}
} );
}
/**
* Returns custom renderer for each cell of the list.vcbc
*
* @param list list to process
* @param value cell value (CustomData object in our case)
* @param index cell index
* @param isSelected whether cell is selected or not
* @param cellHasFocus whether cell has focus or not
* @return custom renderer for each cell of the list
*/
@Override
public Component getListCellRendererComponent (JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus)
{
renderer.setSelected(isSelected);
renderer.setData((CustomData)value);
renderer.setToolTipText(renderer.getText());
return renderer;
}
/**
* Label that has some custom decorations.
*/
private static class CustomLabel extends JLabel
{
/**
*
*/
private static final long serialVersionUID = 1L;
private boolean selected;
public CustomLabel()
{
super();
setOpaque(false);
setFont(new Font("Serif", Font.BOLD, 14));
setBorder(BorderFactory.createEmptyBorder(0, 30, 0, 0));
}
private void setSelected(boolean selected)
{
this.selected = selected;
setForeground(selected ? Color.BLACK : Color.BLACK);
}
private void setData(CustomData data)
{
setText(data.getName());
}
@Override
protected void paintComponent (Graphics g)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint (RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawImage(crossIcon.getImage(), 0,
0, null);
if (selected)
{
g2d.drawImage(crossIcon.getImage(), 0,
0, null);
}
super.paintComponent(g);
}
@Override
public Dimension getPreferredSize()
{
final Dimension ps = super.getPreferredSize();
ps.height = 36;
ps.width = 115;
return ps;
}
}
}
CustomData.java
package JAVA_VIDEOS_TUTORIALS;
/**
* Custom data for our list.
*/
public class CustomData{
private String name;
public CustomData(String name)
{
super ();
this.name = name;
}
public String getName()
{
return name;
}
}