Java 错误:帧无法转换为组件?

Java 错误:帧无法转换为组件?,java,swing,Java,Swing,我在下面的语句中得到一个错误 public class project { JFrame start ; JButton submit; JButton cancel ; JButton fp ; JTextField username; JPasswordField pass ; JLabel uname ; JLabel pawd ; project() { start = new JFrame("Project"); sub

我在下面的语句中得到一个错误

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();
}
}

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

当时我也问了一个类似的问题,但有点太复杂了。 现在,根据我的老师告诉我的,我们将当前课程的对象作为论点,而不是我通过的地方。但“这个”也起作用。那么,上述错误是什么意思?? 除了上面的链接,有人能简单地解释一下吗

更新: 这就是全部代码。事实上,到目前为止,我还不知道你所说的组件概念。我已经听过好几次了。它是一个类还是一个包??你能帮我解释一下吗??当我们应该提供一个组件参数时,null是如何工作的

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

您的当前对象(由
参数引用)不扩展AWT或Swing组件,这就是为什么你看到的错误正是信息所告诉你的。这涉及到几个问题,包括1)理解这是什么意思,2)(有时)理解它在内部类中的含义,3)理解方法参数必须是方法声明中参数的类型或子类型

解决方案很简单:确保将对GUI组件的引用或对
null
的引用传递到该方法的第一个参数中。如果JOptionPane被用作另一个主窗口之外的对话框窗口,则最好避免使用null

请注意,如果您需要更多帮助,特别是如果这个答案不能解决您的问题,那么请告诉我们有关您的问题的更多信息,并显示更多代码,特别是关于JOptionPane方法调用的代码,以及显示类声明的代码,以便我们可以查看您的类的类型

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

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

  • getPassword()返回字符数组,而不是字符串。您需要array.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();
         }
      });
   }
}

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

解决方案很简单:确保将对GUI组件的引用或对
null
的引用传递到该方法的第一个参数中。如果JOptionPane被用作另一个主窗口之外的对话框窗口,则最好避免使用null

请注意,如果您需要更多帮助,特别是如果这个答案不能解决您的问题,那么请告诉我们有关您的问题的更多信息,并显示更多代码,特别是关于JOptionPane方法调用的代码,以及显示类声明的代码,以便我们可以查看您的类的类型

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

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

  • getPassword()返回字符数组,而不是字符串。您需要array.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();
         }
      });
   }
}

目前,我正在使用null运行它。因为我还没有完全理解swing,不过还是要谢谢你。现在,我将通过谷歌搜索您提到的组件部分,然后了解另一种解决方案。@KirtyBhushan:向我们展示该类的代码,我们可能会为您提供更好的解释。@KirtyBhushan:更改为:
JOptionPane.showMessageDialog(开始,“错误的用户名或密码”,“错误提示”),JOptionPane.ERROR_消息)更多建议即将生效!!但我很好奇。当“这个”不起作用时,它是如何起作用的??另外,我还有一个问题(对不起),我已经附加了快照@KirtyBhushan:
仅当您的类扩展了Swing组件而您的类没有扩展时,此
才有效。您的项目类没有扩展任何内容。请注意,您不应该使用null布局和
setBounds(…)
,因为这会导致代码难以维护。目前,我正在使用null运行它。因为我还没有完全理解swing,不过还是要谢谢你。现在,我将通过谷歌搜索您提到的组件部分,然后了解另一种解决方案。@KirtyBhushan:向我们展示该类的代码,我们可能会为您提供更好的解释。@KirtyBhushan:更改为:
JOptionPane.showMessageDialog(开始,“错误的用户名或密码”,“错误提示”),JOptionPane.ERROR_消息)更多建议即将生效!!但我很好奇。当“这个”不起作用时,它是如何起作用的??另外,我还有一个问题(对不起),我已经附加了快照@KirtyBhushan:
仅当您的类扩展了Swing组件而您的类没有扩展时,此
才有效。你