错误:框架无法转换为组件?

Kir*_*han 1 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");
   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();
}
Run Code Online (Sandbox Code Playgroud)

}

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

在这里的'JOptionPane.showConfirmDialog()的第一个参数中得到了一个类似的问题 但它有点太复杂了.现在,根据老师告诉我的内容,我们将当前类的对象作为参数传递,代替我通过它的位置.但"这个"也是这个工作.那么上面提到的错误是什么意思?谁能解释这个比上面的链接?

更新 :

这是整个代码.实际上截至目前,我还不知道你所谈论的组件概念.我听过几次.它是一个类还是一个包?你能不能说一下?当我们应该提供组件参数时,应该感激并且null如何工作?

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

Hov*_*els 5

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

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

请注意,如果您需要更多帮助,特别是如果此答案无法解决您的问题,那么请告诉我们您的问题的更多信息并显示更多代码,尤其是围绕JOptionPane方法调用的代码,并且还显示类声明我们可以看到你的班级是什么类型.

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

JOptionPane.showMessageDialog(start, "Wrong Username or Password","Error Mesage", 
       JOptionPane.ERROR_MESSAGE);
Run Code Online (Sandbox Code Playgroud)

也,

  • 你的getPassword()返回一个char数组,而不是一个String.您需要使用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();
         }
      });
   }
}
Run Code Online (Sandbox Code Playgroud)