Java 为什么我的头部id没有在swing表单中显示数据库中的下一个自动id?如何对必填字段进行编码?

Java 为什么我的头部id没有在swing表单中显示数据库中的下一个自动id?如何对必填字段进行编码?,java,swing,validation,Java,Swing,Validation,我已经将自动id生成设置为表单,它工作正常。但是,我希望在打开表单时,ID应该显示在框架上,当前每次打开表单时它都显示为零 我可以知道它为什么不工作吗?以及在注册表中设置必填字段需要什么类型的代码。“如果必填字段为空,则不应保存详细信息。请提前感谢 import javax.swing.*; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import net.java.dev.designgrid

我已经将自动id生成设置为表单,它工作正常。但是,我希望在打开表单时,ID应该显示在框架上,当前每次打开表单时它都显示为零

我可以知道它为什么不工作吗?以及在注册表中设置必填字段需要什么类型的代码。“如果必填字段为空,则不应保存详细信息。请提前感谢

import javax.swing.*;
import javax.swing.event.*; 
import java.awt.*;
import java.awt.event.*;
import net.java.dev.designgridlayout.DesignGridLayout;
import java.sql.*;

class databaseprob {

    JFrame JF;
    Container C,C1;
    JDesktopPane JDP;
    JInternalFrame JIF5;
    JLabel i1l1,i1l2;
    JTextField i1t1;
    JRadioButton i1r1,i1r2,i1r3,i1r4;
    JButton i1b1,i1b2,i1b3;
    JInternalFrame JIF1;
    ButtonGroup i1bg;
    String i1type;
    int i1id;

    public databaseprob() {
        JF = new JFrame();
        JDP = new JDesktopPane();
        JF.setVisible(true);
        JF.pack();

        JIF1 = new JInternalFrame("Register",true,true, true, true);
        C = JF.getContentPane();
        C.add(JDP,BorderLayout.CENTER);
        JIF1.setVisible(true);
        JIF1.setBounds(10, 10, 600, 500); 
        C1 = JIF1.getContentPane();
        DesignGridLayout layout = new DesignGridLayout(C1);

        i1l1 = new JLabel("Head ID : ");
        i1l2 = new JLabel("Type : ");

        i1t1 = new JTextField(10);
        i1t1.setEnabled(false);
        i1t1.setText(String.valueOf(i1id));

        ActionListener actionListener = new ActionListener() { @Override
            public void actionPerformed(ActionEvent e) {
                JRadioButton radioButton = (JRadioButton)e.getSource();
                i1type = radioButton.getText();
                System.out.println(i1type);
            }
        };

        i1bg = new ButtonGroup();

        i1r1 = new JRadioButton("Customer");
        i1r1.addActionListener(actionListener);
        i1bg.add(i1r1);

        i1r2 = new JRadioButton("Supplier");
        i1r2.addActionListener(actionListener);
        i1bg.add(i1r2);

        i1r3 = new JRadioButton("Staff");
        i1r3.addActionListener(actionListener);
        i1bg.add(i1r3);

        i1r4 = new JRadioButton("Others");
        i1r4.addActionListener(actionListener);
        i1bg.add(i1r4);

        i1b1 = new JButton("Save");
        i1b1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                try {
                    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                    Connection i1conn =  DriverManager.getConnection("Jdbc:Odbc:TomsJava");
                    Statement i1stmt = i1conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
                    ResultSet i1rs = i1stmt.executeQuery("SELECT * FROM i1Register");           
                    int id=0;
                    while(i1rs.next()) {
                        id = i1rs.getInt("Head_ID");
                    }
                    System.out.println(id);
                    i1id = id+1;            

                    i1rs.moveToInsertRow();
                    i1rs.updateInt("Head_ID",i1id);
                    i1rs.updateString("Type",i1type);
                    i1rs.insertRow();   
                    i1stmt.close();
                    i1rs.close();           
                } catch(SQLException e) {
                    System.out.println(e);
                } catch(ClassNotFoundException z) {
                    System.out.println(z);
                } catch(NumberFormatException n) {
                    System.out.println(n);
                }

                JIF1.dispose();
            }
        });

        i1b2 = new JButton("Reset");
        i1b3 = new JButton("Close");

        layout.row().grid(i1l1).add(i1t1);
        layout.row().grid(i1l2).add(i1r1).add(i1r2).add(i1r3).add(i1r4);
        layout.emptyRow();
        layout.row().center().add(i1b1).add(i1b2).add(i1b3);

        JDP.add(JIF1);
    }

    public static void main(String args[]) {
        new databaseprob();
    }
}


我看不到您在更新文本字段,您只是在更新一个字段,该字段包含您以前设置为字段值的值——我认为Swing没有内置的模型视图绑定框架来自动同步UI小部件和字段

解决方案:代替

i1id = id+1;

为什么我的头部id没有显示来自 swing表单中的数据库

这是因为您只需在按下保存按钮时更新文本字段。获取最后一个id和更新数据库记录的代码都在
actionPerformed
方法中:

i1b1.addActionListener(new ActionListener() {
    @Override // always use Override annotation
    public void actionPerformed(ActionEvent ae) {
        // all is done here
    }
};
在显示内部帧之前,需要执行数据库调用,将下一个id设置为
i1t1
文本字段

如何对必填字段进行编码

这取决于具体情况。一种方法可能是使用一种方法来验证是否填写了所有必填字段。例如:

private boolean validateMandatoryFields() {
    return !i1t1.getText().isEmpty() && selectedOption != null;
}
其中,
selectedOption
应该是保存单选按钮组上所选类型的某个变量或类成员。然后修改
i1b1
按钮的操作侦听器以根据此验证的结果执行更新:如果
true
执行更新,否则向用户显示一些警告

注意:如果为组件提供默认值,则可以取消验证。在这种特殊情况下,如果默认选择单选按钮(例如,
i1r4
),则不需要任何验证,因为根据我之前的建议,
i1t1
将具有数据库中的下一个id

离题

我知道你已经没有时间来交付你的项目了,但是下次你必须考虑使用A来执行数据库调用和Swing组件更新。这是因为Swing组件创建/更新必须在一个线程中处理,并且耗时的任务,如数据库调用或IO操作,可能会阻塞这个线程,导致您的GUI没有响应。您可以在本官方文档中阅读更多关于Swing中并发性的信息:

此外,您应该使用大写类和非cryptic变量名调整标准Java编码约定,以增强代码可读性。@Smutje-我一定会在下一个项目中尝试实现这些编码约定,ac实际上,这是我的第一个java项目,它有很多内部框架,大约有18个,所以为了识别内部框架1组件,我在它们前面添加了i1。我尝试过,但是,它只有在我单击save按钮后才会加载头部id,我想这样,它应该在打开register框架时自动生成。可以吗因为您希望在创建框架之前执行数据库操作,而不是在单击按钮时执行,所以您应该对问题进行不同的表述。
private boolean validateMandatoryFields() {
    return !i1t1.getText().isEmpty() && selectedOption != null;
}