table 中的行不可见
Rows are not visibal in table
我想创建 table,它根据患者 ID 显示患者的详细信息,但我的数据未显示在 table 我是 java 的新手 谁能帮助我要解决这个问题,请给我解决这个问题的方法,编译时没有显示错误或警告,运行 程序 String tbcol[]
首先出现,然后在下面显示来自数据库的数据是我的程序在我的 SELECT Query
中也有任何错误吗
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.table.TableModel;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("deprecation")
public class Adi extends JFrame implements ActionListener{
ImageIcon icon;
ImageIcon img4;
Dimension dimension;
JLabel imglab4,symp,diag,med,wr,twr;
JTable tab1;
JTextField pidtxt,tsymp,tdiag,tmed;
JCheckBox cwr;
JComboBox<String> ctwr;
Connection conn1;
Statement st;
DefaultTableModel model;
Adi(){
dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x=(int)((dimension.getWidth() - 700)/2);
int y=(int)((dimension.getHeight() - 500)/2);
setLocation(x, y);
setSize(700,500);
setLayout(null);
setUndecorated(true);
icon = new ImageIcon("image/microscope.png");
setIconImage(icon.getImage());
setResizable(false);
JLabel plable = new JLabel("Patient ID");
plable.setBounds(225,50,80,30);
add(plable);
pidtxt = new JTextField();
pidtxt.setBounds(290,50,100,30);
add(pidtxt);
JButton btnshr=new JButton("Search");
btnshr.setBounds(400,50,80,30);
add(btnshr);
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel();
tab1= new JTable(2,8);
/* model.addRow("Patient ID"); //Didn't worked
model.addRow("Patient Name");
model.addRow("Contact Number");
model.addRow("Age");
model.addRow("Gender");
model.addRow("Blood Group");
model.addRow("Address");
model.addRow("Any Major Disease");*/
model.addRow(tbcol);
tab1.setBounds(100,125,500,30);
add(tab1);
symp = new JLabel("Symptom's");
symp.setBounds(100,225,80,30);
diag = new JLabel("Diagnosis");
diag.setBounds(100,275,80,30);
med = new JLabel("Medicines");
med.setBounds(100,325,80,30);
add(symp);
add(diag);
add(med);
tsymp = new JTextField();
tsymp.setBounds(170,225,180,30);
tdiag = new JTextField();
tdiag.setBounds(170,275,180,30);
tmed = new JTextField();
tmed.setBounds(170,325,180,30);
add(tsymp);
add(tdiag);
add(tmed);
wr = new JLabel("Ward Required");
wr.setBounds(425,225,100,30);
add(wr);
cwr = new JCheckBox("Yes");
cwr.setBounds(550,225,80,30);
add(cwr);
twr = new JLabel("Type of Ward");
twr.setBounds(425,275,100,30);
ctwr = new JComboBox<String>(new String[] {"General","Single","Duo"});
ctwr.setBounds(550,280,100,20);
add(twr);
add(ctwr);
JButton btnsaadi=new JButton("Save");
JButton btncoadi=new JButton("Close");
btnsaadi.setBounds(200,400,80,30);
btncoadi.setBounds(425,400,80,30);
add(btnsaadi);
add(btncoadi);
// Background image
img4 = new ImageIcon("image/m_back.jpg");
imglab4 = new JLabel(img4);
imglab4.setSize(600,600);
add(imglab4);
}
public void actionPerformed(ActionEvent ael){
String adistr =ael.getActionCommand();
if(adistr.equals("Search")){
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
conn1=DriverManager.getConnection("jdbc:ucanaccess://Hospital.accdb");
st = conn1.createStatement();
String sql="select * from Patient where PatientID='"+pidtxt.getText()+"'";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
String patientID =rs.getString("PatientID");
String pname =rs.getString("Pname");
String contactNumber =rs.getString("ContactNumber");
String ages=rs.getString("ages");
String gender=rs.getString("gender");
String bloodGroup=rs.getString("bloodGroup");
String address=rs.getString("address");
String anyMajorDisease=rs.getString("anyMajorDisease");
String tbdata[]={patientID,pname,contactNumber,ages,gender,bloodGroup,address,anyMajorDisease};
model.addRow(tbdata);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public static void main(String[] args){
Adi adi=new Adi();
adi.setVisible(true);
}
}
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel();
tab1= new JTable(2,8);
/*model.addRow("Patient ID"); //Didn't worked
tab1.setBounds(100,125,500,30);
add(tab1);
以上代码根本上是错误的,原因如下:
- 您需要在
TableModel
中定义列。如果没有列,则不会显示任何内容
- 您需要向
TableModel
添加数据行。如果没有行,则不会显示任何内容
-
TableModel
需要添加到 JTable
。如果 JTable
没有 TableModel
则不会显示任何内容
- 您使用 setBounds 的逻辑是创建一个 30 的高度。JTable 中的每一行都是 16 个像素,因此您只会看到两行数据。这就是为什么你永远不应该使用 setBounds() 的原因之一。您应该使用
layout manager
允许组件随着 table 中的数据变化而动态调整大小。此外,应该允许组件随着框架大小的变化而调整大小。
- 需要将
JTable
添加到 JScrollPane
的视口中。当您有两行以上时,这将允许您滚动 table 中的数据。
JScrollPane
需要添加到框架中。如果将 JTable
添加到框架中,则只会显示数据行。通过将 JTable
添加到滚动窗格的视口,您将看到列名称为 header table. 中的数据行
所以上面代码的基本结构应该是:
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel(tbcol, 0);
tab1= new JTable(model);
JScrollPane scrollPane = new JScrollPane( tab1 );
scrollPane.setBounds(100,125,500,30);
add(scrollPane);
以上代码将创建一个 JTable
,其中只有列 header,没有数据。然后,您从 ResultSet 读取数据的逻辑将使用 addRow(...)
方法将数据行添加到模型。
如其他人所述,您不应使用空布局和 setBounds()。阅读提供的教程链接,了解正确使用 JTable、JScrollPane 和布局管理器的示例。
我想创建 table,它根据患者 ID 显示患者的详细信息,但我的数据未显示在 table 我是 java 的新手 谁能帮助我要解决这个问题,请给我解决这个问题的方法,编译时没有显示错误或警告,运行 程序 String tbcol[]
首先出现,然后在下面显示来自数据库的数据是我的程序在我的 SELECT Query
import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import javax.swing.table.TableModel;
import javax.swing.table.DefaultTableModel;
@SuppressWarnings("deprecation")
public class Adi extends JFrame implements ActionListener{
ImageIcon icon;
ImageIcon img4;
Dimension dimension;
JLabel imglab4,symp,diag,med,wr,twr;
JTable tab1;
JTextField pidtxt,tsymp,tdiag,tmed;
JCheckBox cwr;
JComboBox<String> ctwr;
Connection conn1;
Statement st;
DefaultTableModel model;
Adi(){
dimension = Toolkit.getDefaultToolkit().getScreenSize();
int x=(int)((dimension.getWidth() - 700)/2);
int y=(int)((dimension.getHeight() - 500)/2);
setLocation(x, y);
setSize(700,500);
setLayout(null);
setUndecorated(true);
icon = new ImageIcon("image/microscope.png");
setIconImage(icon.getImage());
setResizable(false);
JLabel plable = new JLabel("Patient ID");
plable.setBounds(225,50,80,30);
add(plable);
pidtxt = new JTextField();
pidtxt.setBounds(290,50,100,30);
add(pidtxt);
JButton btnshr=new JButton("Search");
btnshr.setBounds(400,50,80,30);
add(btnshr);
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel();
tab1= new JTable(2,8);
/* model.addRow("Patient ID"); //Didn't worked
model.addRow("Patient Name");
model.addRow("Contact Number");
model.addRow("Age");
model.addRow("Gender");
model.addRow("Blood Group");
model.addRow("Address");
model.addRow("Any Major Disease");*/
model.addRow(tbcol);
tab1.setBounds(100,125,500,30);
add(tab1);
symp = new JLabel("Symptom's");
symp.setBounds(100,225,80,30);
diag = new JLabel("Diagnosis");
diag.setBounds(100,275,80,30);
med = new JLabel("Medicines");
med.setBounds(100,325,80,30);
add(symp);
add(diag);
add(med);
tsymp = new JTextField();
tsymp.setBounds(170,225,180,30);
tdiag = new JTextField();
tdiag.setBounds(170,275,180,30);
tmed = new JTextField();
tmed.setBounds(170,325,180,30);
add(tsymp);
add(tdiag);
add(tmed);
wr = new JLabel("Ward Required");
wr.setBounds(425,225,100,30);
add(wr);
cwr = new JCheckBox("Yes");
cwr.setBounds(550,225,80,30);
add(cwr);
twr = new JLabel("Type of Ward");
twr.setBounds(425,275,100,30);
ctwr = new JComboBox<String>(new String[] {"General","Single","Duo"});
ctwr.setBounds(550,280,100,20);
add(twr);
add(ctwr);
JButton btnsaadi=new JButton("Save");
JButton btncoadi=new JButton("Close");
btnsaadi.setBounds(200,400,80,30);
btncoadi.setBounds(425,400,80,30);
add(btnsaadi);
add(btncoadi);
// Background image
img4 = new ImageIcon("image/m_back.jpg");
imglab4 = new JLabel(img4);
imglab4.setSize(600,600);
add(imglab4);
}
public void actionPerformed(ActionEvent ael){
String adistr =ael.getActionCommand();
if(adistr.equals("Search")){
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
conn1=DriverManager.getConnection("jdbc:ucanaccess://Hospital.accdb");
st = conn1.createStatement();
String sql="select * from Patient where PatientID='"+pidtxt.getText()+"'";
ResultSet rs=st.executeQuery(sql);
while(rs.next()){
String patientID =rs.getString("PatientID");
String pname =rs.getString("Pname");
String contactNumber =rs.getString("ContactNumber");
String ages=rs.getString("ages");
String gender=rs.getString("gender");
String bloodGroup=rs.getString("bloodGroup");
String address=rs.getString("address");
String anyMajorDisease=rs.getString("anyMajorDisease");
String tbdata[]={patientID,pname,contactNumber,ages,gender,bloodGroup,address,anyMajorDisease};
model.addRow(tbdata);
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
public static void main(String[] args){
Adi adi=new Adi();
adi.setVisible(true);
}
}
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel();
tab1= new JTable(2,8);
/*model.addRow("Patient ID"); //Didn't worked
tab1.setBounds(100,125,500,30);
add(tab1);
以上代码根本上是错误的,原因如下:
- 您需要在
TableModel
中定义列。如果没有列,则不会显示任何内容 - 您需要向
TableModel
添加数据行。如果没有行,则不会显示任何内容 -
TableModel
需要添加到JTable
。如果JTable
没有TableModel
则不会显示任何内容 - 您使用 setBounds 的逻辑是创建一个 30 的高度。JTable 中的每一行都是 16 个像素,因此您只会看到两行数据。这就是为什么你永远不应该使用 setBounds() 的原因之一。您应该使用
layout manager
允许组件随着 table 中的数据变化而动态调整大小。此外,应该允许组件随着框架大小的变化而调整大小。 - 需要将
JTable
添加到JScrollPane
的视口中。当您有两行以上时,这将允许您滚动 table 中的数据。 JScrollPane
需要添加到框架中。如果将JTable
添加到框架中,则只会显示数据行。通过将JTable
添加到滚动窗格的视口,您将看到列名称为 header table. 中的数据行
所以上面代码的基本结构应该是:
String tbcol[]={"Patient ID","Patient Name","Contact Number","Age","Gender","Blood Group","Address","Any Major Disease"};
model=new DefaultTableModel(tbcol, 0);
tab1= new JTable(model);
JScrollPane scrollPane = new JScrollPane( tab1 );
scrollPane.setBounds(100,125,500,30);
add(scrollPane);
以上代码将创建一个 JTable
,其中只有列 header,没有数据。然后,您从 ResultSet 读取数据的逻辑将使用 addRow(...)
方法将数据行添加到模型。
如其他人所述,您不应使用空布局和 setBounds()。阅读提供的教程链接,了解正确使用 JTable、JScrollPane 和布局管理器的示例。