【问题标题】:How do I reference a string in another class?如何引用另一个类中的字符串?
【发布时间】:2014-11-15 04:57:06
【问题描述】:

我正在制作一个登录小程序以安装在我的无线硬盘上,并且目前正在为它构建框架,(每次我尝试将字符串声明为任何东西但最终它都会显示一个错误,说只有最终允许)我正在尝试使用在我的 Skeleton 类中找到的 String 用户和 String 传入 if 语句:

package open;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Skeleton extends JFrame implements ActionListener{
    private static final long serialVersionUID = 1248L;

public static void addComponentsToPane(Container pane, Container container) {
    //Adding in text fields for login
    JButton b1 = new JButton("Login");
    final JTextField field2 = new JTextField(2);
    final JTextField field = new JTextField(1);

    //Creating Box Layout - Subject to change
    GroupLayout layout = new GroupLayout(pane);
    pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));
    layout.setAutoCreateGaps(true);
    layout.setAutoCreateContainerGaps(true);

    //Setting alignments
    b1.setAlignmentX(Component.CENTER_ALIGNMENT);
    field.setAlignmentY(BOTTOM_ALIGNMENT);
    field2.setAlignmentY(BOTTOM_ALIGNMENT);
    b1.setAlignmentY(CENTER_ALIGNMENT);

    //Dimensions for User
    field.setMaximumSize(new Dimension(235, 20));
    field.setMinimumSize(new Dimension(235, 20));

    //Dimensions for Password
    field2.setMaximumSize(new Dimension(235, 20));
    field2.setMinimumSize(new Dimension(235, 20));

    //Dimensions for Button
    b1.setMaximumSize(new Dimension(100, 40));
    b1.setMinimumSize(new Dimension(100, 40));

    //Adding space between components
    container.add(Box.createRigidArea(new Dimension(275,20)));
    container.add(field);
    container.add(Box.createRigidArea(new Dimension(275,10)));
    container.add(field2);
    container.add(Box.createRigidArea(new Dimension(275,12)));
    container.add(b1);

    //Listen to the login button
    b1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e)
        {
            String user = field.getText();
            String pass = field2.getText();
            System.out.println("Value: " + user + " " + pass);
        };
    });
}

    public static void createAndShowGUI() {

        JFrame frame = new JFrame("User Login");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        addComponentsToPane(frame.getContentPane(), frame);

        //Create a grey label
        JLabel greyLabel = new JLabel();
        greyLabel.setOpaque(true);
        greyLabel.setBackground(new Color(205, 209, 209));
        greyLabel.setPreferredSize(new Dimension(300, 400));

        //Adding the label to the pane
        frame.getContentPane().add(greyLabel, BorderLayout.CENTER);    

        //Display the window.
        frame.setSize(275, 175);
        frame.setVisible(true);
        }

    public static void closer(boolean close, JFrame frame){
        System.out.println(close);
        if(close == true){
            frame.setVisible(false);
            frame.dispose();
            }
        }
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
                }
            });
        }
public void actionPerformed(ActionEvent arg0) {
    }
}

在我的其他类中几乎什么都没有,因为该类本身依赖于导入字符串变量

package password;

import open.Skeleton;
import refrence.Resources;

public class PasswordCompare    
{
public static void main(String[] args)
    {
    System.out.println(user);
    System.out.println(pass);
    }
}

【问题讨论】:

    标签: java string swing import jframe


    【解决方案1】:

    我自己,我会将上面的 GUI 显示为模态 JDialog,而不是 JFrame,我将使用 JPasswordField 而不是第二个 JTextField,并且我会给我的类提供公共 getter 方法,以允许调用类查询其字段的状态,例如

    public String getUserName() {
        return userNameTextField.getText();
    }
    

    public char[] getPassword() {
       return passwordField.getPassword();
    }
    

    请注意,密码几乎不应该作为字符串处理,因为这样做会给您的应用程序带来严重的漏洞,使其他人更容易提取密码。

    所以作为一个模态对话框,当对话框可见时调用代码停止,只有在对话框不再可见时才重新启动,此时你可以通过上面的方法查询你的对话框的状态,提取相关信息。


    请注意,您的代码使用静态方法,这是您不想做的事情,因为这样做,您的类没有“状态”,因此查询 JTextFields 保存的值将不起作用。


    编辑
    例如:

    import java.awt.GridBagConstraints;
    import java.awt.GridBagLayout;
    import java.awt.Insets;
    
    import javax.swing.*;
    
    public class MySkeleton extends JPanel {
       private static final int COLUMN_COUNT = 10;
       private static final int I_GAP = 3;
       private JTextField userNameField = new JTextField();
       private JPasswordField passwordField = new JPasswordField();
    
       public MySkeleton() {
          super(new GridBagLayout());
          userNameField.setColumns(COLUMN_COUNT);
          passwordField.setColumns(COLUMN_COUNT);
    
          GridBagConstraints gbc = getGbc(0, 0, GridBagConstraints.BOTH);
          add(new JLabel("User Name:"), gbc);
          gbc = getGbc(1, 0, GridBagConstraints.HORIZONTAL);
          add(userNameField, gbc);
          gbc = getGbc(0, 1, GridBagConstraints.BOTH);
          add(new JLabel("Password:"), gbc);
          gbc = getGbc(1, 1, GridBagConstraints.HORIZONTAL);
          add(passwordField, gbc);
       }
    
       public static GridBagConstraints getGbc(int x, int y, int fill) {
          GridBagConstraints gbc = new GridBagConstraints();
          gbc.gridx = x;
          gbc.gridy = y;
          gbc.gridwidth = 1;
          gbc.gridheight = 1;
          gbc.weightx = 1.0;
          gbc.weighty = 1.0;
          gbc.insets = new Insets(I_GAP, I_GAP, I_GAP, I_GAP);
          gbc.fill = fill;
    
          return gbc;
       }
    
       public String getUserName() {
          return userNameField.getText();
       }
    
       public char[] getPassword() {
          return passwordField.getPassword();
       }
    }
    

    可以通过以下方式在另一个类中测试:

    public class MySkeletonTest {
       private static void createAndShowGui() {
          MySkeleton mainPanel = new MySkeleton();
    
          int input = JOptionPane.showConfirmDialog(null, mainPanel, "Login",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
          if (input == JOptionPane.OK_OPTION) {
             System.out.println("User Name: " + mainPanel.getUserName());
    
             // **** for testing purposes only. Never do this in a real app.
             System.out.println("Password:  " + new String(mainPanel.getPassword()));
          }
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

    【讨论】:

    • 感谢您的所有意见,我真的很感激,我计划回家后测试和修补很多新信息!
    【解决方案2】:

    你确定你只需要一个类来比较密码吗?这应该是您的ActionListener 的代码。另外,您甚至没有在代码中实例化 Skeleton,因此您无法访问这些字段。如果您确实需要这样做,只需在 Skeleton 上定义一些 getter。

    public String getPassword() {
       return field2.getText(); //you should really rename this field
    }
    
    public String getUser() {
       return field.getText(); //you should really rename this field
    }
    

    【讨论】:

    • 我知道我不需要一个,但我宁愿让另一个班级运行它,只是为了让事情保持良好和独立,而且它使以后更容易扩展
    猜你喜欢
    • 2011-10-24
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    相关资源
    最近更新 更多