我在JCheckbox
中有一个JTable
的GUI,其中表是使用vector帮助填充数据库的数据。
我提供以下代码从数据库中提取数据:
try {
PreparedStatement pre = con.prepareStatement("select * from ProductInformation where CustomerName='"+cust_name+"'");
Vector<Vector<String>> historyVector = new Vector<Vector<String>>();
rs = pre.executeQuery();
while(rs.next())
{
Vector<String> history = new Vector<String>();
serial_no=rs.getString("SerialNumber");
history.add(serial_no);
history.add(rs.getString("Model"));
history.add(rs.getString("InvoiceNumber"));
history.add(rs.getString("Location"));
historyVector.add(history);
}
data=historyVector;
header = new Vector<String>();
header.add("Serial No");
header.add("Model");
header.add("Invoice no");
header.add("Location");
header.add("ASC");
header.add("AMC");
amcAscResult();
mainframe.add(amcascresult);
mainframe.remove(amc);
mainframe.validate();
mainframe.repaint();
mainframe.pack();
}
catch(Exception e){
System.err.println(e);
}
我遇到了一个问题,比如当我运行程序时,我选择了一些JCheckbox
,它返回Null指针异常。
有时它按预期运行。
我将代码插入表
的代码 amcasc_table.setModel(new javax.swing.table.DefaultTableModel(
data,header
) {
boolean[] canEdit = new boolean [] {
false, false, false, true, true
};
private static final long serialVersionUID = 1L;
/*@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}*/
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
default:
return Boolean.class;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane1.setViewportView(amcasc_table);
获取JCheckbox
的值。
for (int i = 0; i <amcasc_table.getRowCount(); i++) {
boolean isChecked = (Boolean) amcasc_table.getValueAt(i, 4);
if (isChecked) {
//get the values of the columns you need.
String value = (String) amcasc_table.getValueAt(i, 0);
System.out.println(value);
}
}
我做了什么错误,任何人都可以帮我解决这个问题吗?
SSCCE
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.sql.*;
import java.text.DateFormat;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.swing.*;
public class Combined {
Session session;
JFrame mainframe,mailframe;
JPanel firstpane, newsales, confirmnewsales, checkserialno, producthistory, newcomplaint, newcomplaintentry;
JPanel confirmcomplaint,sendmail,generatereport,generatereportresult,amc,amcascresult,amcascconfirm;
JMenuBar menuBar;
JMenu menu;
JMenuItem menuItem;
JMenu submenu;
JRadioButtonMenuItem rbMenuItem;
JCheckBoxMenuItem cbMenuItem;
Connection con,con1;
Statement st,st1;
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Format mmFormat = new SimpleDateFormat("MM");
DateFormat yyFormat = new SimpleDateFormat("yy");
DateFormat ddFormat = new SimpleDateFormat("dd");
String invoice_no;
String serial_no;
String model;
String cust_name;
String cust_location;
String amc_status;
Date date_of_purchase;
Date amc_start_date;
Date amc_end_date;
String amcend_date;
String amcstart_date;
ButtonModel amc_status_model;
String query;
ResultSet rs,rs1;
Date dateofpurchase;
String date_ofpurchase;
String query1;
String eng_name;
String problem_description;
String contact_person;
String contact_no;
String calldate;
String callmonth;
String callyear;
String callno;
int inccallno;
String lastcallno;
String query3, query4, query5;
String lastcalldate;
String sinccallno;
String db;
String toaddress;
String subject;
String messagebody;
String warrantystatus;
Vector<Vector<String>> data;
Vector<String> header;
String callstatus;
int no_of_calls = 0;
public Combined() {
connect();
framegen();
}
private void framegen() {
mainframe = new JFrame("Product Maintenance and Support Software");
//Create the menu bar.
menuBar = new JMenuBar();
//Build the first menu.
menu = new JMenu("A Menu");
menu.setMnemonic(KeyEvent.VK_A);
menu.getAccessibleContext().setAccessibleDescription(
"The only menu in this program that has menu items");
menuBar.add(menu);
//a group of JMenuItems
menuItem = new JMenuItem("A text-only menu item",
KeyEvent.VK_T);
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_1, ActionEvent.ALT_MASK));
menuItem.getAccessibleContext().setAccessibleDescription(
"This doesn't really do anything");
menu.add(menuItem);
menuItem = new JMenuItem("Both text and icon",
new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_B);
menu.add(menuItem);
menuItem = new JMenuItem(new ImageIcon("images/middle.gif"));
menuItem.setMnemonic(KeyEvent.VK_D);
menu.add(menuItem);
//a group of radio button menu items
menu.addSeparator();
ButtonGroup group = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem("A radio button menu item");
rbMenuItem.setSelected(true);
rbMenuItem.setMnemonic(KeyEvent.VK_R);
group.add(rbMenuItem);
menu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Another one");
rbMenuItem.setMnemonic(KeyEvent.VK_O);
group.add(rbMenuItem);
menu.add(rbMenuItem);
//a group of check box menu items
menu.addSeparator();
cbMenuItem = new JCheckBoxMenuItem("A check box menu item");
cbMenuItem.setMnemonic(KeyEvent.VK_C);
menu.add(cbMenuItem);
cbMenuItem = new JCheckBoxMenuItem("Another one");
cbMenuItem.setMnemonic(KeyEvent.VK_H);
menu.add(cbMenuItem);
//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("An item in the submenu");
menuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_2, ActionEvent.ALT_MASK));
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);
//Build second menu in the menu bar.
menu = new JMenu("Another Menu");
menu.setMnemonic(KeyEvent.VK_N);
menu.getAccessibleContext().setAccessibleDescription(
"This menu does nothing");
menuBar.add(menu);
mainframe.setJMenuBar(menuBar);
firstpane();
mainframe.add(firstpane);
mainframe.pack();
mainframe.setVisible(true);
mainframe.setDefaultCloseOperation(3);
mainframe.setResizable(false);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Combined com = new Combined();
}
private void connect() {
try {
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(driver);
String db1 = "jdbc:odbc:solaris";
con = DriverManager.getConnection(db1);
st = con.createStatement();
} catch (ClassNotFoundException | SQLException ex) {
System.out.println("database connection failed");
}
}
private void firstpane() {
firstpane = new JPanel();
addnewsales_button = new javax.swing.JButton();
newcomplaint_button = new javax.swing.JButton();
calllist_button = new javax.swing.JButton();
generatereport_button = new javax.swing.JButton();
serialnocheck_button = new javax.swing.JButton();
solaris_logo = new javax.swing.JLabel();
Support_label = new javax.swing.JLabel();
putAMC_button = new javax.swing.JButton();
firstpane.setBackground(new java.awt.Color(255, 255, 255));
addnewsales_button.setText("Add New Sales Entry");
addnewsales_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// addnewsales_buttonActionPerformed(evt);
}
});
newcomplaint_button.setText("New Complaint");
newcomplaint_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// newcomplaint_buttonActionPerformed(evt);
}
});
calllist_button.setText("Call list");
calllist_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// calllist_buttonActionPerformed(evt);
}
});
generatereport_button.setText("Generate Report");
generatereport_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
//generatereport_buttonActionPerformed(evt);
}
});
serialnocheck_button.setText("Serial Number Check");
serialnocheck_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
// serialnocheck_buttonActionPerformed(evt);
}
});
solaris_logo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/combined/image/Solaris_logo.jpg"))); // NOI18N
Support_label.setText("Support Section");
putAMC_button.setText("Put AMC");
putAMC_button.addActionListener(new java.awt.event.ActionListener() {
@Override
public void actionPerformed(java.awt.event.ActionEvent evt) {
putAMC_buttonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(firstpane);
firstpane.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addComponent(calllist_button).addGap(41, 41, 41).addComponent(putAMC_button).addGap(28, 28, 28).addComponent(generatereport_button).addGap(74, 74, 74)).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addComponent(solaris_logo).addGap(132, 132, 132)))).addGroup(layout.createSequentialGroup().addGap(20, 20, 20).addComponent(addnewsales_button).addGap(44, 44, 44).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addComponent(Support_label, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap()).addGroup(layout.createSequentialGroup().addComponent(serialnocheck_button).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, Short.MAX_VALUE).addComponent(newcomplaint_button).addGap(23, 23, 23)))));
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addGap(32, 32, 32).addComponent(solaris_logo, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(Support_label, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 72, Short.MAX_VALUE).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(addnewsales_button).addComponent(serialnocheck_button).addComponent(newcomplaint_button)).addGap(28, 28, 28).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(calllist_button).addComponent(generatereport_button).addComponent(putAMC_button)).addGap(34, 34, 34)));
}
private void putAMC_buttonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
amc();
mainframe.add(amc);
mainframe.remove(firstpane);
mainframe.validate();
mainframe.repaint();
mainframe.pack();
}
private void amc() {
amc=new JPanel();
custname_label = new javax.swing.JLabel();
custname_txtbox = new javax.swing.JTextField();
amc_search_button = new javax.swing.JButton();
amc.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "AMC Sign up", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, null, new java.awt.Color(0, 0, 0)));
custname_label.setText("Enter the Customer Name");
amc_search_button.setText("Search");
amc_search_button.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
amc_search_buttonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(amc);
amc.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(custname_label)
.addGap(18, 18, 18)
.addComponent(custname_txtbox, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 46, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addGap(116, 116, 116)
.addComponent(amc_search_button)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(46, 46, 46)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(custname_label)
.addComponent(custname_txtbox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(51, 51, 51)
.addComponent(amc_search_button)
.addContainerGap(136, Short.MAX_VALUE))
);
}
private void amc_search_buttonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
cust_name=custname_txtbox.getText().trim();
try {
PreparedStatement pre = con.prepareStatement("select * from ProductInformation where CustomerName='"+cust_name+"'");
Vector<Vector<String>> historyVector = new Vector<Vector<String>>();
rs = pre.executeQuery();
while(rs.next())
{
Vector<String> history = new Vector<String>();
serial_no=rs.getString("SerialNumber");
System.out.println("here");//Empid
history.add(serial_no);
history.add(rs.getString("Model"));
history.add(rs.getString("InvoiceNumber"));
history.add(rs.getString("Location"));
historyVector.add(history);
}
data=historyVector;
header = new Vector<String>();
header.add("Serial No");
header.add("Model");
header.add("Invoice no");
header.add("Location");
header.add("ASC");
header.add("AMC");
amcAscResult();
mainframe.add(amcascresult);
mainframe.remove(amc);
mainframe.validate();
mainframe.repaint();
mainframe.pack();
}
catch(Exception e){
System.err.println(e);
}
}
private void amcAscResult() {
amcascresult=new JPanel();
custname_label = new javax.swing.JLabel();
custname_var_label = new javax.swing.JLabel();
location_label = new javax.swing.JLabel();
custlocation_var_label = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
amcasc_table = new javax.swing.JTable();
putamcasc_button = new javax.swing.JButton();
amcascresult.setBorder(javax.swing.BorderFactory.createTitledBorder("Put AMC"));
custname_label.setText("Customer Name :");
custname_var_label.setText(cust_name);
location_label.setText("Location :");
custlocation_var_label.setText("<location>");
amcasc_table.setModel(new javax.swing.table.DefaultTableModel(
data,header
) {
boolean[] canEdit = new boolean [] {
false, false, false, true, true
};
private static final long serialVersionUID = 1L;
/*@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}*/
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return String.class;
case 3:
return String.class;
default:
return Boolean.class;
}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit [columnIndex];
}
});
jScrollPane1.setViewportView(amcasc_table);
putamcasc_button.setText("Put AMC/ASC");
putamcasc_button.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
putamcasc_buttonActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(amcascresult);
amcascresult.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(putamcasc_button)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(custname_label)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(custname_var_label)
.addGap(18, 18, 18)
.addComponent(location_label)
.addGap(18, 18, 18)
.addComponent(custlocation_var_label))
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(custname_label)
.addComponent(custname_var_label)
.addComponent(location_label)
.addComponent(custlocation_var_label))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 213, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 10, Short.MAX_VALUE)
.addComponent(putamcasc_button))
);
}
private void putamcasc_buttonActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
for (int i = 0; i <amcasc_table.getRowCount(); i++) {
boolean isChecked = (Boolean) amcasc_table.getValueAt(i, 4);
if (isChecked) {
//get the values of the columns you need.
String value = (String) amcasc_table.getValueAt(i, 0);
System.out.println(value);
}
}
amcAscConfirm();
mainframe.add(amcascconfirm);
mainframe.remove(amcascresult);
mainframe.validate();
mainframe.repaint();
mainframe.pack();
}
private void amcAscConfirm() {
amcascconfirm=new JPanel();
confirm_label = new javax.swing.JLabel();
finish_button = new javax.swing.JButton();
amcascconfirm.setBorder(javax.swing.BorderFactory.createTitledBorder("Confirmation of AMC/ASC"));
confirm_label.setText("AMC/ASC has been availed for the machines selected");
finish_button.setText("Finish");
finish_button.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
finish_button1ActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(amcascconfirm);
amcascconfirm.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(73, 73, 73)
.addComponent(confirm_label)
.addGap(0, 95, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(finish_button)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGap(59, 59, 59)
.addComponent(confirm_label)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 169, Short.MAX_VALUE)
.addComponent(finish_button)
.addContainerGap())
);
}
private void finish_button1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
mainframe.add(firstpane);
mainframe.remove(amcascconfirm);
mainframe.validate();
mainframe.repaint();
mainframe.pack();
}
private javax.swing.JLabel confirm_label;
private javax.swing.JButton finish_button;
private javax.swing.JTable amcasc_table;
private javax.swing.JLabel custlocation_var_label;
private javax.swing.JLabel custname_label;
private javax.swing.JLabel custname_var_label;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JLabel location_label;
private javax.swing.JButton putamcasc_button;
private javax.swing.JButton amc_search_button;
private javax.swing.JTextField custname_txtbox;
private javax.swing.JLabel Support_label;
private javax.swing.JButton addnewsales_button;
private javax.swing.JButton calllist_button;
private javax.swing.JButton generatereport_button;
private javax.swing.JButton newcomplaint_button;
private javax.swing.JButton putAMC_button;
private javax.swing.JButton serialnocheck_button;
private javax.swing.JLabel solaris_logo;
}
答案 0 :(得分:1)
在你不完整的例子的700多行中,有几个问题突出:
这个词有时表明同步不正确;验证所有Swing GUI对象是否仅在event dispatch thread上构建和操作 。
确保TableModel
从Boolean.class
返回getColumnClass()
复选框列,而不仅仅是default
;使用DefaultTableModel
的完整示例可能会显示为here和here。
请勿替换组件,例如您的第一个片段中的amc
和 magnum opus中的amcascconfirm
;更新所包含组件的相应模型。
独立于您的程序验证正确的查询结果;如果架构发生变异,select *
会特别麻烦。
答案 1 :(得分:0)
我发现自己问题出在
return Boolean.class;
如果未选中该复选框,则返回null,因为它是包装类。
我把它整理出来.. 如果返回null,则将布尔变量初始化为false。
解决了这个问题。 :)