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方法 --------------------编程问答--------------------
怎么写?迷糊中,我使用其他的方法也可以解决[]的问题,但是这样影响我的整体思路,所以给点提示吧,基础差诚心求教啊 --------------------编程问答-------------------- 学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