Error :Frames cannot be converted to components?

Error :Frames cannot be converted to components?

我在以下语句中遇到错误

public class project {

JFrame start ; 
 JButton submit; 
 JButton cancel ;
 JButton fp ;
 JTextField username; 
 JPasswordField pass ;
 JLabel uname ;
 JLabel pawd ;

    project()
{
    start = new JFrame("Project");
   submit = new JButton("Submit");
   cancel = new JButton("Cancel");
   fp = new JButton("Forgot Password ?") ;    
 uname = new JLabel("Username");
 pass = new JPasswordField();
 pawd = new JLabel("Password");
 username = new JTextField();
 start.setBounds(300,400,900,900);
 start.setResizable(true);
 start.setVisible(true);
 uname.setBounds(180,200,80,25);
 pawd.setBounds(230,225,80,25);

submit.setBounds(250,350,90,25);
 cancel.setBounds(3400,350,90,25);
 username.setBounds(300,200,100,25);
 pass.setBounds(300,230,100,25);
 fp.setBounds(420,215,125,25);
 start.add(submit);
 start.add(cancel);
 start.add(fp);
 start.add(username);
 start.add(pass);
 start.add(username);
 
 start.add(uname);
 start.add(pawd);
 submit.addActionListener(new ActionListener (){
    public  void actionPerformed(ActionEvent ae){
         submitperformed(ae);
     }
 });
 
}

public void submitperformed(ActionEvent ae)
{
   
    if((username.getText()).equals("root") && (pass.getPassword().equals("11223344")))
    {
       start.setVisible(false);
    }
    
    else
    JOptionPane.showMessageDialog( null,"Wrong Username or Password","Error Mesage", JOptionPane.ERROR_MESSAGE);
            
   
}
public void cancelperformed(ActionEvent ae)
{
   
   System.exit(0);
           
   
}
public static void main(String []s)
{
    project a = new project();
}

}

类型不兼容:框架“项目”无法转换为组件!

我在 What is first argument in 'JOptionPane.showConfirmDialog() here? 收到了类似的问题,但有点太复杂了。 现在,根据我的老师告诉我的,我们将 current class 的对象作为参数来代替我传递它的地方。但是“这个”也能起到作用。那么上面提到的错误是什么意思? 谁能比上面的简单解释一下 link ??

更新:

这就是全部代码。实际上,到目前为止,我还不知道您所说的组件概念。我听过几次。是 class 还是包裹??你能解释一下吗?将不胜感激,当我们应该提供组件参数时,null 是如何工作的??

还有一件事!! 我附上了上述代码结果的快照。忽略按钮和用户名标签。请注意密码 label.Now 这不是我设置边界所依据的位置。无论我设置什么界限,它的位置都不会改变。令人沮丧,我不知道是什么导致了这个问题。这与在设置边界之前添加标签和按钮或类似的东西有关吗?请你仔细看一下,看看发生了什么??

您当前的对象(由 this 参数引用)没有扩展 AWT 或 Swing 组件,这就是为什么您看到的错误与消息中所说的完全一样。这涉及几个问题,包括 1)理解 this 的含义,2)(有时)理解内部 classes 的含义,3)理解方法参数必须是类型或子类型方法声明中参数的类型...

解决方案很简单:确保将对 GUI 组件或 null 的引用传递到该方法的第一个参数中。如果 JOptionPane 被用作另一个主要 window.

的对话框 window,最好避免使用 null

请注意,如果您需要更多帮助,尤其是如果此答案不能解决您的问题,请告诉我们更多关于您的问题并显示更多代码,尤其是 JOptionPane 方法调用周围的代码,还有显示 class 声明,以便我们可以看到您的 class 是什么类型。

使用 Swing 组件作为 JOptionPane 的第一个参数,这里 start 会很好地工作:

JOptionPane.showMessageDialog(start, "Wrong Username or Password","Error Mesage", 
       JOptionPane.ERROR_MESSAGE);

此外,

  • 您的 getPassword() returns 一个字符数组,而不是字符串。您需要 Arrays.equals 进行比较。
  • 避免使用 null 布局和 setBounds,因为这会导致难以维护难看的代码(正如您所发现的那样)并且通常会导致难看的 GUI。而是使用布局管理器。

例如使用 GridBagLayout:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.util.Arrays;

import javax.swing.*;

public class Project2 {
   private static final int COLUMN_COUNT = 10;
   private static final int I_GAP = 3;
   private JTextField userNameField = new JTextField();
   private JPasswordField passwordField = new JPasswordField();
   private JPanel mainPanel = new JPanel(new GridBagLayout());

   public Project2() {
      userNameField.setColumns(COLUMN_COUNT);
      passwordField.setColumns(COLUMN_COUNT);

      GridBagConstraints gbc = getGbc(0, 0, GridBagConstraints.BOTH);
      mainPanel.add(new JLabel("User Name:"), gbc);
      gbc = getGbc(1, 0, GridBagConstraints.HORIZONTAL);
      mainPanel.add(userNameField, gbc);
      gbc = getGbc(0, 1, GridBagConstraints.BOTH);
      mainPanel.add(new JLabel("Password:"), gbc);
      gbc = getGbc(1, 1, GridBagConstraints.HORIZONTAL);
      mainPanel.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 JComponent getMainPanel() {
      return mainPanel;
   }

   private static void createAndShowGui() {
      Project2 project2 = new Project2();

      int input = JOptionPane.showConfirmDialog(null, project2.getMainPanel(),
            "Login", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
      if (input == JOptionPane.OK_OPTION) {
         if (project2.getUserName().equals("root") && 
               Arrays.equals(project2.getPassword(), "11223344".toCharArray())) {
            // you're good
         } else {
            JOptionPane.showMessageDialog(project2.getMainPanel(),
                  "error message", "Error Title", JOptionPane.ERROR_MESSAGE);
         }
      }
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}