Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入后无法刷新显示的JTable_Java_Mysql_Swing - Fatal编程技术网

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列,其中填充了