Swing 中的 Java 继承/重用能力

Posted

技术标签:

【中文标题】Swing 中的 Java 继承/重用能力【英文标题】:Java Inheritance/Reuse-ability in swing 【发布时间】:2015-05-05 14:58:45 【问题描述】:
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();
    


上面提到的代码是我Swing的开始,作为一个新手我只是想创建2个方法

一个用于数据库连接 其他用于 gui 当我尝试访问 connectDB() 中的 placeComponent() 属性时,它显示错误。有人可以帮我吗?

错误出现在 executeUpdate 语句中,无法识别“idtextfield”和“nametextfield”

谢谢!!!

【问题讨论】:

这些是范围为placeComponents 的变量,未在connectDB 中定义。请阅读变量范围:java-made-easy.com/variable-scope.html 跟继承无关。 executeUpdate() 由于作用域不同,不能使用提到的变量 我猜测与继承无关,但由于它们是内置类的实例,我该如何使用它们?我的意思是如何扩大他们的范围? 您需要将保存 GUI 元素的变量声明为类字段,而不是 placeComponents() 函数中的变量。 此外,最佳实践是分离出关注点 - 在这种情况下,连接到数据库甚至检索数据之类的事情应该/不/在您的摇摆/显示类中......考虑制作一个具有数据点的抽象表示的数据视图。您将能够以这种方式编写测试和/或稍后重用您的代码。 【参考方案1】:

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

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

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

    您摆脱了静态方法。

    它不使用 setBounds()。 Swing 旨在与布局管理器一起使用。请参阅布局管理器的教程部分。

    代码将在 EDT 上创建。请参阅Concurrency 上的教程部分。

【讨论】:

【参考方案2】:

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

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);

    .....
   

【讨论】:

【参考方案3】:

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

您可以通过两种方式解决此问题。

    你可以在类中声明它们。

    您可以从JPanel 实例中获取实例。

在这方面,我想提请您注意另一件事。您已使用Statement 使用用户输入的文本执行查询。存在“SQL 注入”的可能性。所以如果你改用PreparedStatement会更好。

【讨论】:

以上是关于Swing 中的 Java 继承/重用能力的主要内容,如果未能解决你的问题,请参考以下文章

java继承

继承.

关于 Java Swing 中组件类的继承层次结构的说明?

继承多态接口

Java学习笔记7.3.1 用户界面 - Swing常用组件

Java学习笔记7.3.1 用户界面 - Swing常用组件