java - 使用 Java 中的 Swing 进行文件处理编程

标签 java swing file-handling

我需要第 2 步的帮助来了解 java 中文件处理的工作原理,,,,...

这就是我正在做的事情......:- 问题:异常 注意:我是这个概念的新手,请告诉我我的代码有什么问题。

-使用 swing 创建一个迷你 Java 应用程序,它必须要求输入用户名和密码,并有一个创建按钮。

-按下创建按钮后,必须使用用户名创建一个新目录,并且必须将密码保存为该目录内的password.txt 文件。

-如果目录已存在,则应出现一个弹出窗口,显示“用户已存在”。

我已经尝试了几个小时,但无法正确完成,非常感谢您的帮助。

我需要查看一些相关代码,同时我不断尝试修复我的代码。

更新的代码:

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;

class CreateUser implements ActionListener
{   
    JFrame fr;  //Frame
    JButton b1;  //Create Button
    JLabel lb1, lb2;    //Username and password
    JTextField tf1, tf2;    //Username and password input fields
    JPanel p1;

    CreateUser()
    {
        //Setting the frame
        fr=new JFrame();
        fr.setLayout(null);
        fr.setSize(400,400);

        //setting panel
        p1=new JPanel();
        p1.setBounds(0,0,400,400);
        p1.setLayout(null);

        //setting Username Label
        JLabel lb1=new JLabel("Username: ");
        lb1.setBounds(50,50,70,30);
        p1.add(lb1);

        //setting Username Text Field
        JTextField tf1 = new JTextField();
        tf1.setBounds(150,50,150,30);
        p1.add(tf1);


        //setting Password Label
        JLabel lb2=new JLabel("Password: ");
        lb2.setBounds(50,100,70,30);
        p1.add(lb2);

        //setting Password Text Field
        JTextField tf2 = new JTextField();
        tf2.setBounds(150,100,150,30);
        p1.add(tf2);

        //setting Button
        b1=new JButton("Create");
        b1.setBounds(100,200,100,40);   
        p1.add(b1);

        fr.add(p1);
        fr.setVisible(true);    
        b1.addActionListener(this);
        tf1.addActionListener(this);
        tf2.addActionListener(this);

    }

    public static void main(String s[])
    {
        new CreateUser();
    }

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==b1)
        {   
            {
                String uid = tf1.getText();
                String pass = tf2.getText();

                String dir = System.getProperty("user.dir");

                //Creating a new folder Users

                File file = new File(dir+"\\users");
                if (!file.exists()) 
                {
                    if (file.mkdir()) 
                    {
                        System.out.println("Directory is created!");
                    } 
                    else 
                    {
                        System.out.println("Failed to create directory!");
                    }
                }
                dir = dir+"\\users";

                //Creating a folder named with username inside Users folder

                File file1 = new File(dir+"\\"+uid);
                if (!file1.exists()) 
                {
                    if (file1.mkdir()) 
                    {
                        System.out.println("Directory is created!");
                    } 
                    else 
                    {
                        System.out.println("Failed to create directory!");
                    }
                }

                //Storing Password.txt inside users/username folder

                try
                {
                    FileOutputStream fout=new FileOutputStream("password.txt");
                    byte b[]=pass.getBytes();
                    fout.write(b);
                }
                catch(Exception ee)
                {}
            }
        }
    }           
}

最佳答案

这里有很多潜在的问题,所以让我们看一下代码:

class CreateUser implements ActionListener {

小问题:避免让 GUI 类实现控制接口(interface)。这给了类太多的责任,使类​​变得困惑,导致代码笨重而难以调试。最好使用匿名内部类或非匿名内部类。

JFrame fr; // Frame
JButton b1; // Create Button
JLabel lb1, lb2; // Username and password
JTextField tf1, tf2; // Username and password input fields
JPanel p1;

小问题:字段应该始终是私有(private)的,除非您有特定原因要公开。您不这样做,所以在这里将它们设为私有(private)。

CreateUser() {
    // Setting the frame
    fr = new JFrame();
    fr.setLayout(null);
    fr.setSize(400, 400);

小问题:永远、永远、永远不要使用 null 布局。虽然 null 布局和 setBounds() 对于 Swing 新手来说似乎是创建复杂 GUI 的最简单、最好的方法,但创建的 Swing GUI 越多,使用它们时遇到的困难就越严重。当 GUI 调整大小时,它们不会调整组件的大小,它们是增强或维护的皇家女巫,当放置在滚动 Pane 中时,它们会完全失败,在所有平台或与原始分辨率不同的屏幕分辨率上查看时,它们看起来非常糟糕。

    // setting panel
    p1 = new JPanel();
    p1.setBounds(0, 0, 400, 400);
    p1.setLayout(null);

同样的问题。了解布局管理器,然后使用布局管理器。

    // setting Username Text Field
    JTextField tf1 = new JTextField();

主要问题:您正在此处遮挡一个字段。通过在类构造函数中重新声明 tf1 变量,您可以将 JTextField 对象分配给本地变量,这意味着类中的 tf1 字段保持为空/未分配/空。如果您尝试使用此 null 字段,这可能会导致调用 NullPointerException。

因此,如果您要在构造函数或 init 方法中进行对象创建和赋值,则不要使用

    JTextField tf1 = new JTextField();

做:

    tf1 = new JTextField(); 


    // setting Password Text Field
    JTextField tf2 = new JTextField();

同样的问题。另外,这应该是 JPasswordField 而不是 JTextField。

    // setting Button
    b1 = new JButton("Create");

由于某种原因,您正确分配了按钮。想想吧。

public static void main(String s[]) {
    new CreateUser();
}

始终在 Swing 事件线程或 EDT(事件调度线程)上启动 Swing 应用程序。这样做:

public static void main(String s[]) {
    SwingUtilities.invokeLater(() -> new CreateUser());        
}
<小时/>
try {
    FileOutputStream fout = new FileOutputStream("password.txt");
    byte b[] = pass.getBytes();
    fout.write(b);
} catch (Exception ee) {

}

主要问题:永远不要有一个空的 catch block ,这相当于试图蒙住眼睛驾驶汽车。至少打印出堆栈跟踪,以便在错误发生时您会收到通知。另外,如果您要写出文本,请使用 PrintWriter 等书写器。我不会讨论写出密码文本的危险,但显然这是您在现实生活中永远不会做的事情。

关于java - 使用 Java 中的 Swing 进行文件处理编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38252547/

相关文章:

java - Swing - 尝试从 JList 中删除项目时出现异常

java.lang.UnsatisfiedLinkError : lotus/domino/axis/transport/http/NotesSocket. openConnection()

java - 在 JFrame 的内容 Pane 中重新排列 JPanel?

java - 如何仅单击一次鼠标即可编辑 JXTreeTable 单元格?

java - jFormattedTextField 的 MaskFormatter 删除插入的值

Perl:打开一个文件,并在编辑后以不同的名称保存它

C语言使用文件操作创建数据库

java - 在 javaee-api maven-project 中放置静态文件的位置

java - 在 ArrayList 线程安全上移动对象的最佳方法是什么?

ios - 为什么我的 iOS 应用程序没有出现在其他应用程序的 "Open in"对话框中?