效果如上图,JComboBox下拉框弹出JTable,并且可以实现查询

解决方案 »

  1.   

    可以是可以 不过你得重写不止一个两个方法 甚至还涉及到重写 ComboBoxModel等有关的类
    也许你可以尝试给JTextField添加点击事件弹出一个框 显示table然后点击了就放到text里面
      

  2.   

    可以的,在itemStateChanged事件创建个Jtable么
      

  3.   

    自己写一个。
    继承JComboBox 比自己写一个都费事。
    Swing Hacks里有个下拉出一个颜色选择窗口的例子可以参考。
      

  4.   

    出现问题了,感觉是基础的问题.自己写了个JComboBox,但是从数据库取出的每个值都加了[**]还有一个@d8876的乱码(怀疑是列名).代码如下,请高手指出错误.错误纠正后准备放入jtable完善功能.界面
    public class liebiao extends JFrame {
    private JComboBox jcbx;
    private JPanel jP1;
    private JLabel jlb1;
    private List list1;
    private Vector vct; private String sql = "select UserName 登陆名  FROM tblSysUser where 1=?";
    private String[] paras = { "1" }; public static void main(String[] args) {
    // TODO Auto-generated method stub
    liebiao lb = new liebiao();
    } public liebiao(){



    jP1 =new JPanel();
    jlb1 =new JLabel("选择下拉框");
    jcbx =new JComboBox();
    //getJComboBox();
    //设置JComboBox
    jcbx.removeAllItems();
    jcbx.addItem("选择");
    listmodel lh =new listmodel();
    lh.listquery(jcbx ,sql, paras);
    jcbx.addItem(lh);
    jcbx.setEditable(true);

    jcbx.addItemListener(new ItemListener() {

    public void itemStateChanged(ItemEvent e) {



    }

    }
    );


    jP1.add(jlb1);
    jP1.add(jcbx);

    this.add(jP1);


    this.setSize(1024, 768);
    // 窗口居中显示
    this.setLocationRelativeTo(null);
    // 退出的时候关闭,保证程序退出,比较重要,不关闭那么就停留在内存当中影响运行速度.
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 显示窗体
    this.setVisible(true);

    }
    }
    驱动模型
    package list;import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;import javax.swing.JComboBox;
    import javax.swing.table.AbstractTableModel;
    public class listmodel extends AbstractTableModel{



    private Vector columns;
    public  void listquery(JComboBox jcbx ,String sql,String[] paras) {

    listhelp sh = new listhelp();
    ResultSet rs = sh.query(sql, paras);
    columns = new Vector();

    //此方法便 于扩展
    try {
    //从rs对象中可以得到一个ResultSetMetaData
    ResultSetMetaData rsmd = rs.getMetaData();
    for(int i=0;i<rsmd.getColumnCount();i++) {
    columns.add(rsmd.getColumnName(i+1));
    }
    //把rs的结果放到rowDate
    while(rs.next()) {
    Vector temp = new Vector();
    for(int i=0;i<rsmd.getColumnCount();i++) {
    temp.add(rs.getString(i+1));
    }
    jcbx.addItem(temp);
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } @Override
    public int getColumnCount() {
    // TODO Auto-generated method stub
    return this.columns.size();
    } @Override
    public String getColumnName(int column) {
    // TODO Auto-generated method stub
    return (String)columns.get(column);
    } @Override
    public int getRowCount() {
    // TODO Auto-generated method stub
    return 0;
    } @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    return null;
    }}
    dbhelp界面
    package list;
    /*
    * 对数据库操作的类
    * 对数据库的操作,就是crud
    * 调用存储过程

    *注意:如果连接数据库时出现如下异常则表示未引入三个JAR驱动包,另外一个原因就是SQL语句有语法错误
    *java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDviver
    * */
    import java.util.*;
    import java.sql.*;
    public class listhelp {

    //定义操作数据库需要的东西
    PreparedStatement ps=null;
    Connection  ct=null;
    ResultSet rs=null;
    String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
    String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=test";
    String user="sa";
    String passwd="123456";
     

    //构造函数
    public listhelp(){

    try {
    //加载驱动
    Class.forName(driver);
    //得到连接
    ct=DriverManager.getConnection(url,user,passwd);
     System.out.println("成功加载驱动,成功连接服务器");
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    //[]paras,通过?赋值方式可以防止漏洞注入方式,保证安全性

    public ResultSet query(String sql,String []paras)
    {
    try {
    ps=ct.prepareStatement(sql);
    //对sql的参数赋值
    for(int i=0;i<paras.length;i++)
    {
    ps.setString(i+1, paras[i]);
    }
    //执行查询
    rs=ps.executeQuery();// 执行更新并返回操作数据库行数
    } catch (Exception e) {
    e.printStackTrace();
    // TODO: handle exception
    }
    System.out.println("rs="+rs);
    //返回结果集
    return rs;
    }
    //关闭资源的方法
    public void close()
    {
    try {
    if(rs!=null) rs.close();
    if(ps!=null) ps.close();
    if(ct!=null) ct.close();
    } catch (Exception e) {
    e.printStackTrace();
    // TODO: handle exception
    }
    }
    }
      

  5.   

    默认的渲染器使用默认的toString。
    需要你自己重写toString方法
      

  6.   

    学java一个多月时间,有的问题比较弱智请大家原谅.完全自学的,主要看视频
    准备分步完成
    1.制作一个JComboBox,并可以从数据库取出值 
    2.使JComboBox实现查询功能 
    3.JComboBox弹出JTable完成. 现在第一步出现乱码问题.一步一步完成.
      

  7.   

    已解决:解决乱码问题.输入关键字回车后可以从下拉框显示.
    求::查询输入关键字后提取关键字相似项目并排序到第一位.主界面
    package list;import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;import java.util.Iterator;
    import java.util.List;
    import java.util.Vector;import javax.swing.ComboBoxEditor;
    import javax.swing.ComboBoxModel;
    import javax.swing.DefaultComboBoxModel;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import list.listmodel;
    import list.listhelp;
    public class liebiao extends JFrame {
        private JComboBox jcbx;
        private JPanel jP1;
        private JLabel jlb1;
        private List list1;
        private Vector vct;    private String sql = "select UserName 登陆名  FROM tblSysUser where 1=?";
        private String[] paras = { "1" };
        String defaultMessage="请选择";    public static void main(String[] args) {
            // TODO Auto-generated method stub
            liebiao lb = new liebiao();    }    public liebiao(){
        
            jP1 =new JPanel();
            jlb1 =new JLabel("选择下拉框");
            jcbx =new JComboBox();
            //getJComboBox();
            //设置JComboBox   
            List listinfo = listmodel.findList(sql, paras);              
            jcbx.removeAllItems(); 
            Iterator iter = listinfo.iterator(); 
            while(iter.hasNext()){
             List a =(List)iter.next();
    jcbx.addItem(a.get(0));
            }
            
            jcbx.setEditable(true);
            ComboBoxEditor editor=jcbx.getEditor();
            jcbx.configureEditor(editor,defaultMessage);        
            jcbx.getEditor().getEditorComponent().addKeyListener(new KeyListener() {

    @Override
    public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub
    }

    @Override
    public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub
    String str = jcbx.getEditor().getItem().toString();
    if (str.length() == 0){
    System.out.println("请输入客户简称");
    return;
    }else if (str.length() > 0) {
    if (str != null) {
    try {
    jcbx.showPopup();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    }


    }

    @Override
    public void keyPressed(KeyEvent e) {
    // TODO Auto-generated method stub

    }
    });
            jP1.add(jlb1);
            jP1.add(jcbx);
            
            this.add(jP1);
            
            
            this.setSize(1024, 768);
            // 窗口居中显示
            this.setLocationRelativeTo(null);
            // 退出的时候关闭,保证程序退出,比较重要,不关闭那么就停留在内存当中影响运行速度.
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        // 显示窗体
            this.setVisible(true);
            
        } 
        
        
    }listmode
    package list;import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Vector;import javax.swing.JComboBox;
    import javax.swing.table.AbstractTableModel;public class listmodel extends AbstractTableModel{


    private Vector rowDate,columns;

    public static List findList(String sql,String[] paras) {
    List<List> list = new ArrayList<List>();

    listhelp sh = new listhelp();
    ResultSet rs = sh.query(sql, paras);
    try {
    ResultSetMetaData metaData = rs.getMetaData();
    int colCount = metaData.getColumnCount();
    System.out.println("colCount==="+colCount);
    while (rs.next()) {
    List<String> row = new ArrayList<String>();
    for (int i = 1; i <= colCount; i++) {
    String str =  rs.getString(i);
    if (str != null && !str.isEmpty())
    str = str.trim();
    row.add(str);
    System.out.println("str==="+str);
    }
    list.add(row);
    System.out.println("row==="+row);
    System.out.println("list==="+list);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return list;
    }

    // public static Vector getUsers() {
    //
    // Vector listinfo =findForList(sql1, paras1);
    // return listinfo;
    // } public  void listquery(String sql,String[] paras) {

    listhelp sh = new listhelp();
    ResultSet rs = sh.query(sql, paras);
    columns = new Vector();
    rowDate = new Vector();

    //此方法便 于扩展
    try {
    //从rs对象中可以得到一个ResultSetMetaData
    ResultSetMetaData rsmd = rs.getMetaData();
    for(int i=0;i<rsmd.getColumnCount();i++) {
    columns.add(rsmd.getColumnName(i+1));
    }
    //把rs的结果放到rowDate
    while(rs.next()) {
    Vector temp = new Vector();
    for(int i=0;i<rsmd.getColumnCount();i++) {
    temp.add(rs.getString(i+1));
    }
    rowDate.add(temp);
    }
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } @Override
    public int getColumnCount() {
    // TODO Auto-generated method stub
    return this.columns.size();
    } @Override
    public int getRowCount() {
    // TODO Auto-generated method stub
    return this.rowDate.size();
    } @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    // TODO Auto-generated method stub
    return ((Vector)rowDate.get(rowIndex)).get(columnIndex);
    }
    public String getColumnName(int column) {
    // TODO Auto-generated method stub
    return (String)columns.get(column);
    }}
    dbhelp
    package list;
    /*
    * 对数据库操作的类
    * 对数据库的操作,就是crud
    * 调用存储过程

    *注意:如果连接数据库时出现如下异常则表示未引入三个JAR驱动包,另外一个原因就是SQL语句有语法错误
    *java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDviver
    * */
    import java.util.*;
    import java.sql.*;
    public class listhelp {
        
        //定义操作数据库需要的东西
        PreparedStatement ps=null;
        Connection  ct=null;
        ResultSet rs=null;    
        String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";
        String url="jdbc:sqlserver://127.0.0.1:1433;databaseName=test";
        String user="sa";
        String passwd="123456";
         
        
        //构造函数
        public listhelp(){
            
            try {
                //加载驱动
                Class.forName(driver);
                //得到连接
                ct=DriverManager.getConnection(url,user,passwd);
                 System.out.println("成功加载驱动,成功连接服务器");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        //[]paras,通过?赋值方式可以防止漏洞注入方式,保证安全性
            
        public ResultSet query(String sql,String []paras)
        {
            try {
                ps=ct.prepareStatement(sql);
                //对sql的参数赋值
                for(int i=0;i<paras.length;i++)
                {
                    ps.setString(i+1, paras[i]);
                }
                //执行查询
                rs=ps.executeQuery();// 执行更新并返回操作数据库行数
            } catch (Exception e) {
                e.printStackTrace();
                // TODO: handle exception
            }
            System.out.println("rs======"+rs);
            //返回结果集
            return rs;
            
        }    
        //关闭资源的方法
        public void close()
        {
            try {
                if(rs!=null) rs.close();
                if(ps!=null) ps.close();
                if(ct!=null) ct.close();
            } catch (Exception e) {
                e.printStackTrace();
                // TODO: handle exception
            }
        }
    }