gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:29:51 24 4
gpt4 key购买 nike

我需要第 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com