当前位置:编程学习 > JAVA >>

JComboBox下拉框弹出JTable可以实现吗?


效果如上图,JComboBox下拉框弹出JTable,并且可以实现查询 --------------------编程问答-------------------- 可以是可以 不过你得重写不止一个两个方法 甚至还涉及到重写 ComboBoxModel等有关的类
也许你可以尝试给JTextField添加点击事件弹出一个框 显示table然后点击了就放到text里面 --------------------编程问答-------------------- 可以的,在itemStateChanged事件创建个Jtable么 --------------------编程问答-------------------- 自己写一个。
继承JComboBox 比自己写一个都费事。
Swing Hacks里有个下拉出一个颜色选择窗口的例子可以参考。 --------------------编程问答-------------------- 自己写个吧 --------------------编程问答-------------------- 刚入门,目前只处于修改代码阶段,重新写难度颇大,因为要对输入的数据有查找功能.有类似功能的代码最好.谢谢啊. --------------------编程问答-------------------- 我可以说,绝对现实,很轻松的可以实现

理论上你可以弹出任何东西....... --------------------编程问答-------------------- 出现问题了,感觉是基础的问题.自己写了个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
}
}
}

--------------------编程问答-------------------- 默认的渲染器使用默认的toString。
需要你自己重写toString方法 --------------------编程问答--------------------
引用 8 楼 huntor 的回复:
默认的渲染器使用默认的toString。
需要你自己重写toString方法



怎么写?迷糊中,我使用其他的方法也可以解决[]的问题,但是这样影响我的整体思路,所以给点提示吧,基础差诚心求教啊 --------------------编程问答-------------------- 学java一个多月时间,有的问题比较弱智请大家原谅.完全自学的,主要看视频
准备分步完成
1.制作一个JComboBox,并可以从数据库取出值 
2.使JComboBox实现查询功能 
3.JComboBox弹出JTable完成. 

现在第一步出现乱码问题.一步一步完成. --------------------编程问答-------------------- 已解决:解决乱码问题.输入关键字回车后可以从下拉框显示.
求::查询输入关键字后提取关键字相似项目并排序到第一位.

主界面
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
        }
    }
}


--------------------编程问答-------------------- 这个界面不好看
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,