![](/img/trans.png)
[英]JTable not rendering JCheckBox or JComboBox in the table in Java Applet
[英]JComboBox and JTable in java applet
这是一个Java小程序的代码,其中,组合框将从Access数据库中检索内容,并且当我们选择一个项目时,它必须显示具有“ composition”字段作为选定组合框项目的表行。 我的问题是,这在我第一次选择时效果很好。 在显示我的第一个选择的结果(这是一个表)时,如果我在组合框上进行第二个选择,则面板将变为空白。 我希望它也为连续的选择重复显示相应的输出。 请帮助我诊断错误。 提前致谢!
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.util.Date;
import java.sql.*;
import java.text.*;
public class gc implements ActionListener
{
JComboBox cc=new JComboBox();
JFrame frame=new JFrame();
JTable table;
DefaultTableModel model;
String query;
int i;
JPanel panel=new JPanel();
public gc()
{
frame.setTitle("Composition Check");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel p1=new JPanel();
p1.setLayout(new FlowLayout());
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
ResultSet rs=st.executeQuery("select DISTINCT composition from try");
while(rs.next())
{
cc.addItem(rs.getString("composition"));
}
conn.close();
}
catch(Exception e)
{
}
p1.add(cc);
cc.addActionListener(this);
frame.add(p1,BorderLayout.NORTH);
frame.setVisible(true);
}
public void addTable(String query)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conn=DriverManager.getConnection("jdbc:odbc:vasantham","","");
Statement st=conn.createStatement();
System.out.println(query);
ResultSet rs=st.executeQuery(query);
ResultSetMetaData md=rs.getMetaData();
int cols=md.getColumnCount();
model=new DefaultTableModel();
model.addColumn("Purpose");
model.addColumn("Name");
model.addColumn("Manu");
model.addColumn("Expiry");
model.addColumn("Stock");
model.addColumn("Cost");
model.addColumn("Supplier");
model.addColumn("Supplier Number");
model.addColumn("Rack");
table=new JTable(model);
String[] tabledata=new String[cols];
int i=0;
while(rs.next())
{
for(i=0;i<cols;i++)
{
tabledata[i]=rs.getObject(i+1).toString();
}
model.addRow(tabledata);
}
JScrollPane scroll = new JScrollPane(table);
panel.setLayout(new BorderLayout());
panel.add(scroll,BorderLayout.CENTER);
frame.add(panel,BorderLayout.CENTER);
conn.close();
}
catch(Exception e)
{
}
}
public void actionPerformed(ActionEvent evt)
{
String ac=(String)cc.getSelectedItem();
System.out.println(ac);
addTable("select * from try where composition='"+ac+"'");
frame.setVisible(true);
}
public static void main(String[] args)
{
new gc();
}
}
加
panel.removeAll();
在添加滚动窗格之前。 这将清除窗格,并为下一组结果留出空间。
更新对我来说,更好的方法是简单地替换表的模型。 通过在每次运行时更换滚动窗格和表格,可以减少内存泄漏的风险。
向JTable添加类级别引用,并在ui单元代码中添加
table = new JTable();
JScrollPane scroll = new JScrollPane(table);
panel.setLayout(new BorderLayout());
panel.add(scroll,BorderLayout.CENTER);
frame.add(panel,BorderLayout.CENTER);
现在,在您的数据更新代码中,按原样创建新模型,然后调用
table.setModel(model);
这应该更新得更快,但更重要的是,只需较少的内存即可完成。
至于日期格式。 您有两种选择。 您可以格式化数据库中显示的值,也可以提供自己的单元格渲染器。
public class SQLDateTableCellRenderer extends DefauktTableCellRenderer {
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
if (value instanceof java.sql.Date) {
value = new SimpleDateFormat("dd/MM/yyyy").format(value);
}
retrun super.getTableCellRenderer(...);
}
}
原谅我的短手,我在我的iPad上。 最好使用对日期格式的静态或类引用,但这将需要meto类型更多;)
然后可以将其设置为JTable上的默认渲染器。 这使您无需知道哪些列需要格式化SQL日期。
table.setDefaultRenderer(java.sql.Date, new SQLDateTableCellRenderer());
当然,这意味着您需要先将对象从数据库中提取出来,然后再将其转换为字符串,然后直接将对象提取出来
tabledata[i]=rs.getObject(i+1);
确保将表数据转换为Object []数组而不是字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.