You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在三个JFrame间传递值?以Login.java到NursePage再到UpdateStatus为例

Hey there! Let's walk through how to pass the username from Login.java to NursePage.java and then on to UpdateStatus.java—I'll cover a few clean, maintainable approaches that work great for Swing apps.

This is the cleanest approach because it enforces that the username is provided when creating the frame, eliminating null pointer risks and keeping your code decoupled.

Step 1: Pass from Login to NursePage

In your Login.java, after validating the login, create the NursePage and pass the username directly through its constructor:

// Login.java
public class Login extends JFrame {
    // Inside your login button's action listener
    private void loginButtonActionPerformed(ActionEvent evt) {
        String username = usernameTextField.getText();
        
        // Assume you've already handled login validation here
        if (isLoginValid(username)) {
            // Create NursePage with the username
            NursePage nurseDashboard = new NursePage(username);
            nurseDashboard.setVisible(true);
            this.dispose(); // Close the login window
        }
    }

    // Dummy validation method
    private boolean isLoginValid(String username) {
        return username != null && !username.isEmpty();
    }
}

Step 2: Pass from NursePage to UpdateStatus

In NursePage.java, store the username and pass it to UpdateStatus when opening that frame:

// NursePage.java
public class NursePage extends JFrame {
    private String currentUser;

    // Constructor that accepts the username
    public NursePage(String username) {
        this.currentUser = username;
        initializeUI(); // Your method to set up buttons/labels
    }

    private void initializeUI() {
        // Example button to open UpdateStatus
        JButton openUpdateBtn = new JButton("Update Patient Status");
        openUpdateBtn.addActionListener(evt -> {
            // Pass the stored username to UpdateStatus
            UpdateStatus statusFrame = new UpdateStatus(currentUser);
            statusFrame.setVisible(true);
        });
        add(openUpdateBtn);
        // Rest of your UI setup...
    }
}

Step 3: Receive and Use in UpdateStatus

Finally, UpdateStatus.java accepts the username via its constructor and uses it as needed:

// UpdateStatus.java
public class UpdateStatus extends JFrame {
    public UpdateStatus(String username) {
        // Use the username directly in your UI
        JLabel userLabel = new JLabel("Logged in as: " + username);
        add(userLabel);
        
        // Add your status update components here...
        pack();
        setLocationRelativeTo(null);
    }
}

2. Setter Methods (Flexible for Dynamic Updates)

If you need to set the username after creating the frame (or update it later), setter methods are a good alternative.

Login.java

private void loginButtonActionPerformed(ActionEvent evt) {
    String username = usernameTextField.getText();
    if (isLoginValid(username)) {
        NursePage nurseDashboard = new NursePage();
        nurseDashboard.setUsername(username); // Call setter
        nurseDashboard.setVisible(true);
        this.dispose();
    }
}

NursePage.java

public class NursePage extends JFrame {
    private String currentUser;

    // Setter method
    public void setUsername(String username) {
        this.currentUser = username;
    }

    private void openUpdateStatus() {
        UpdateStatus statusFrame = new UpdateStatus();
        statusFrame.setUsername(currentUser); // Pass via setter
        statusFrame.setVisible(true);
    }
}

UpdateStatus.java

public class UpdateStatus extends JFrame {
    private JLabel userLabel;

    public UpdateStatus() {
        userLabel = new JLabel();
        add(userLabel);
        // UI setup...
    }

    public void setUsername(String username) {
        userLabel.setText("Logged in as: " + username);
        // Update other components if needed
    }
}

3. Static Global Variable (Use Sparingly!)

This is the simplest approach but comes with downsides (tight coupling, potential thread issues). Only use this for small, simple apps.

First, create a helper class to hold the global data:

// GlobalSession.java
public class GlobalSession {
    public static String loggedInUsername;
}

Login.java

private void loginButtonActionPerformed(ActionEvent evt) {
    String username = usernameTextField.getText();
    if (isLoginValid(username)) {
        GlobalSession.loggedInUsername = username;
        NursePage nurseDashboard = new NursePage();
        nurseDashboard.setVisible(true);
        this.dispose();
    }
}

NursePage & UpdateStatus

No need to pass the username explicitly—just read it from the global class:

// In NursePage, when opening UpdateStatus
private void openUpdateStatus() {
    UpdateStatus statusFrame = new UpdateStatus();
    statusFrame.setVisible(true);
}

// In UpdateStatus.java
public UpdateStatus() {
    String username = GlobalSession.loggedInUsername;
    JLabel userLabel = new JLabel("Logged in as: " + username);
    add(userLabel);
}

Quick Notes

  • Always prefer constructor injection first: it makes dependencies explicit and prevents bugs from missing data.
  • Avoid static globals unless absolutely necessary—they make testing harder and can lead to unexpected behavior in multi-threaded apps.
  • For larger Swing projects, you might look into dependency injection frameworks, but for most cases, the first two methods are more than enough.

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:49:56