swing中的Java继承/重用能力

swing中的Java继承/重用能力,java,swing,jdbc,Java,Swing,Jdbc,上面提到的代码是我开始摇摆的地方,作为一个新手,我只是尝试创建两个方法 一个用于数据库连接 gui的其他功能 当我试图访问connectDB()中placeComponent()的属性时,它显示了一个错误。有人能帮我吗 错误出现在executeUpdate语句中,无法识别“idtextfield”和“nametextfield” 谢谢 在类级别声明/定义它们: package fisheriesdatabase; import java.sql.*; import java.awt.Con

上面提到的代码是我开始摇摆的地方,作为一个新手,我只是尝试创建两个方法

  • 一个用于数据库连接
  • gui的其他功能
    当我试图访问connectDB()中placeComponent()的属性时,它显示了一个错误。有人能帮我吗
错误出现在executeUpdate语句中,无法识别“idtextfield”和“nametextfield”


谢谢

在类级别声明/定义它们:

package fisheriesdatabase;

import java.sql.*;
import java.awt.Container;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class FisheriesDatabase {

public static void main(String[] args) {
    JFrame frame=new JFrame("Fish Data Entry");
    frame.setSize(500,500);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JPanel panel=new JPanel();
    frame.add(panel);
    placeComponents(panel);

    frame.setVisible(true);
}

public static void placeComponents(JPanel panel){
    panel.setLayout(null);

    JLabel idlabel=new JLabel("id");
    idlabel.setBounds(10, 10, 80, 25);
    panel.add(idlabel);
    JTextField idtextfield=new JTextField(20);
    idtextfield.setBounds(100, 10, 160, 25);
    panel.add(idtextfield);

    JLabel namelabel=new JLabel("Name");
    namelabel.setBounds(10, 40, 80, 25);
    panel.add(namelabel);        
    JTextField nametextfield=new JTextField(20);
    nametextfield.setBounds(100, 40, 160, 25);
    panel.add(nametextfield);

    JButton button=new JButton("Enter Data");
    button.setBounds(10, 80, 80, 25);
    panel.add(button);

}

public static void connectDB() throws SQLException{
    final String url="jdbc:mysql://localhost:3306";
    final String driver="com.mysql.jdbc.Driver";
    final String dbName="netbeans_test";
    final String uname="root";
    final String pass="";

    Connection conn=null;
    try{
        //Registering the Driver
        Class.forName(driver).newInstance();

        //Open a connection
        conn=DriverManager.getConnection(url+dbName,uname,pass);
        Statement st=conn.createStatement();
        st.executeUpdate("insert into test values('"+idtextfield.getText()+"','"+nametextfield.getText()+"')");            

    }
    catch(ClassNotFoundException | InstantiationException | IllegalAccessException se){
        if(conn==null)
            System.err.println("DATABASE NOT CONNECTED");
        se.printStackTrace();
    }
}
}

我建议您从中的示例开始,学习如何更好地构建您的程序

也许这一节是一个简单的好例子。在此示例中,面板用于包含所有组件。这将允许您创建可以从panel类中实现的任何方法访问的实例变量

从工作示例开始的其他好处:

  • 你摆脱了你的静态方法

  • 它不使用setBounds()。Swing设计用于布局管理器。请参见有关布局管理器的教程部分

  • 代码将在EDT上创建。请参阅关于并发性的教程部分


  • 您的程序中基本上只有一个问题。您正在使用两种方法
    placeComponents
    connectDB()
    。您已在
    placeComponents()
    方法中声明并初始化变量
    idtextfield
    nametextfield
    ,并尝试从
    connectDB()
    方法访问它。变量的范围仅在方法
    placeComponents()
    中。因此,它给出了错误“无法识别'idtextfield'和'nametextfield'”

    你可以用两种方法解决这个问题

  • 您可以在类中声明它们

  • 您可以从
    JPanel
    实例获取实例


  • 在这方面,我还要提请大家注意另一件事。您已经使用
    语句
    使用用户输入的文本执行查询。存在“SQL注入”的可能性。因此,最好使用
    PreparedStatement

    这些变量的作用域是
    placeComponents
    ,并且未在
    connectDB
    中定义。请仔细阅读变量范围:它与内在性无关
    executeUpdate()
    由于作用域不同,无法使用上述变量。我猜这与继承无关,但由于它们是内置类的实例,我如何使用它们?我的意思是如何扩展它们的范围?您需要将保存GUI元素的变量声明为类字段,而不是在placeComponents()函数中声明为变量。此外,最佳做法是分离关注点-在这种情况下,连接到DB甚至检索数据都应该/不应该/应该在您的swing/display类中。。。考虑用数据点的抽象表示来制作数据视图。您将能够以这种方式编写测试和/或稍后重用代码。
    public class FisheriesDatabase {
    
    JTextField idtextfield=new JTextField(20);
    JTextField nametextfield=new JTextField(20);
    
    public static void main(String[] args) {
        ....
        ....
    }
    
    public static void placeComponents(JPanel panel){
        panel.setLayout(null);
    
        .....
    }