Java 插入后无法刷新显示的JTable
我有个问题。我对Java 插入后无法刷新显示的JTable,java,mysql,swing,Java,Mysql,Swing,我有个问题。我对Java相当陌生,目前我正在尝试学习一些基本的东西 因此,我创建了一个带有Textfieldvor输入的小型GUI,以及一个按钮,用该查询(将输入作为变量)向我的数据库发起查询 我用查询结果填充了一个ResultSet,并希望在JTable中显示结果。 我试着这样做: public class AppWindow extends JFrame { private ResultSet rs = null; JTextField textfield_where_
Java
相当陌生,目前我正在尝试学习一些基本的东西
因此,我创建了一个带有Textfield
vor输入的小型GUI
,以及一个按钮
,用该查询(将输入作为变量)向我的数据库发起查询
我用查询结果填充了一个ResultSet
,并希望在JTable
中显示结果。
我试着这样做:
public class AppWindow extends JFrame {
private ResultSet rs = null;
JTextField textfield_where_1;
JTextField textfield_where_2;
JTable tabellenspass;
JButton button;
public AppWindow() {
this.getContentPane().setLayout(null);
this.initWindow();
protected void initWindow()
{
// Instanzieren:
textfield_where_1 = new JTextField();
textfield_where_2 = new JTextField();
tabellenspass = new JTable();
button = new JButton("muh");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
Abfrage();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
// Positionen festlegen
textfield_where_1.setBounds(5,10,400,25);
tabellenspass.setBounds(5,40,400,100);
button.setBounds(300,110,100,30);
// Elemente dem Fenster hinzufügen:
this.getContentPane().add(textfield_where_1);
this.getContentPane().add(button);
this.getContentPane().add(tabellenspass);
this.pack();
}
public void Abfrage() throws Exception
{
// Eingabestrings holen
String eingabe1 = textfield_where_1.getText();
select_dies_das ausgabe = new select_dies_das();
rs = ausgabe.select(eingabe1);
Ausgabe_Tabelle(rs);
}
private void Ausgabe_Tabelle(ResultSet rs)
{
try
{
// Rows / Columns der Tabelle setzen
ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
// Tabellenmodel
DefaultTableModel model = new DefaultTableModel();
tabellenspass.setModel(model);
//model.fireTableRowsInserted(0, 5);
int columns = rsmd.getColumnCount();
// Resultset Zeiger zurueck setzen
rs.beforeFirst();
while (rs.next()) {
Object[] row = new Object[columns];
for (int i = 1; i <= columns; i++)
{
row[i - 1] = rs.getObject(i);
}
model.insertRow(rs.getRow() -1,row);
System.out.println("miau");
}
// tabellenspass.setModel(model);
tabellenspass.repaint();
}
catch(Exception e)
{
System.out.println(e);
}
}
公共类AppWindow扩展JFrame{
私有结果集rs=null;
JTextField textfield_,其中_1;
JTextField textfield_,其中_2;
JTable tabellenspass;
按钮;
公共应用程序窗口(){
this.getContentPane().setLayout(null);
this.initWindow();
受保护的void initWindow()
{
//Instanzieren:
textfield_,其中_1=新的JTextField();
textfield_,其中_2=新的JTextField();
tabellenspass=new JTable();
按钮=新按钮(“muh”);
addActionListener(新建ActionListener()){
已执行的公共无效操作(操作事件arg0){
试一试{
Abfrage();
}捕获(例外e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
});
//菲斯特莱根酒店
textfield_,其中_1.立根(5,10400,25);
tabellenspass.setBounds(5,40400100);
按钮立根(300110100,30);
//芬斯特新祖夫根元素:
this.getContentPane().add(textfield_,其中_1);
this.getContentPane().add(按钮);
this.getContentPane().add(tabellenspass);
这个包();
}
public void Abfrage()引发异常
{
//埃因加霍伦酒店
字符串eingabe1=textfield_其中_1.getText();
select_dies_das ausgabe=新建select_dies_das();
rs=ausgabe.select(eingabe1);
Ausgabe_Tabelle(rs);
}
私人无效Ausgabe_Tabelle(结果集rs)
{
尝试
{
//表列设置的行/列
ResultSetMetaData rsmd=(ResultSetMetaData)rs.getMetaData();
//Tabellenmodel
DefaultTableModel=新的DefaultTableModel();
tabellenspass.setModel(model);
//模型。fireTableRowsInserted(0,5);
int columns=rsmd.getColumnCount();
//结果集Zeiger-Zureck-setzen
rs.beforeFirst();
while(rs.next()){
对象[]行=新对象[列];
对于(int i=1;i要通知JTable
有关更改,请使用:
通知所有侦听器表行中的所有单元格值可能已更改
您也可以尝试重新验证和重新喷漆,或者:
或
并查看更多信息…要通知JTable
有关更改,请使用:
通知所有侦听器表行中的所有单元格值可能已更改
您也可以尝试重新验证和重新喷漆,或者:
或
并检查进一步的信息…我认为问题在于您的表格模型没有正确初始化,您需要使用公共默认表格模型(Object[][]数据,Object[]列名){…}
构造函数为其指定标题名称:)
当然,您需要根据需要在模型中添加或删除列,也不需要使用rs.beforeFirst();
语句,因为您已经在使用while循环
,该循环检查结果集
是否有另一行下一行()
此界面的方法
,如果您使用此语句,请确认您的结果集
是可滚动的,否则您将获得
org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY.
最好评论这句话
//rs.beforeFirst();
您还可以使用此model.addRow(row);
语句更改model.insertRow(rs.getRow()-1,row);
我已经尝试了你的代码,这就是结果
也许您应该考虑将<代码> jTabe>代码>添加到<代码> JSCROLPANE<代码>中,以保持可见“代码>页眉<代码>,并将<代码>布局设置为您的设计,类似于此
setTitle("Test");
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
JPanel data = new JPanel();
this.getContentPane().add(textfield_where_1);
this.getContentPane().add(data);
data.add(button);
JScrollPane scroll = new JScrollPane(tabellenspass);
data.add(scroll);
scroll.setPreferredSize(new Dimension(400, 100));
button.setPreferredSize(new Dimension(100, 100));
textfield_where_1.setPreferredSize(new Dimension(400, 25));
我认为问题在于您的TableModel
没有正确初始化,您需要使用public-DefaultTableModel(Object[]data,Object[]columnNames){…}
构造函数为其指定头
名称:)
当然,您需要根据需要在模型中添加或删除列,也不需要使用rs.beforeFirst();
语句,因为您已经在使用while循环
,该循环检查结果集
是否有另一行下一行()
此界面的方法
,如果您使用此语句,请确认您的结果集
是可滚动的,否则您将获得
org.postgresql.util.PSQLException: Operation requires a scrollable ResultSet, but this ResultSet is FORWARD_ONLY.
最好评论这句话
//rs.beforeFirst();
您还可以使用此model.addRow(row);
语句更改model.insertRow(rs.getRow()-1,row);
我已经尝试了你的代码,这就是结果
也许您应该考虑将<代码> jTabe>代码>添加到<代码> JSCROLPANE<代码>中,以保持可见“代码>页眉<代码>,并将<代码>布局设置为您的设计,类似于此
setTitle("Test");
this.getContentPane().setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));
JPanel data = new JPanel();
this.getContentPane().add(textfield_where_1);
this.getContentPane().add(data);
data.add(button);
JScrollPane scroll = new JScrollPane(tabellenspass);
data.add(scroll);
scroll.setPreferredSize(new Dimension(400, 100));
button.setPreferredSize(new Dimension(100, 100));
textfield_where_1.setPreferredSize(new Dimension(400, 25));
嗨!嗯,我不能在JTable上使用它,但在模型上使用它。但它仍然没有改变任何东西;((顺便说一句,结果集不是空的或什么的,该行包含213列,其中包含5行以上的数据)Mhm不起作用。可能是initWindow过程有问题吗?或者我可能没有使用正确的变量吗?请检查@Osuka answer!嗨!嗯,我不能在JTable上使用它,但在模型上使用它。但它仍然不会改变任何东西;((顺便说一句,结果集不是空的,或者其他什么,这行包含213列,其中填充了