【问题标题】:How can I get my JAVA Method-Chaining to work?我怎样才能让我的 JAVA 方法链工作?
【发布时间】:2018-12-18 05:38:19
【问题描述】:

我正在尝试做一些简单的方法链接,但总是在中途出现错误“找不到符号”。 例如:

public JButton[] getSignOnButtons() {
    return InitialFrame.getInitialPanel().getSignOnButtons();
}

我正在实现 MVC 模型,在 View Package 中我有 4 个类:View、InitialFrame、InitialPanel、NorthPanel。为了让我的 Controller 与 View 包进行通信,我总是通过 View Class。

我的控制器类需要访问视图类的属性,最好的方法是什么?

我之前通过公开所有 View 类的属性来“欺骗”它,这样我就可以从视图中创建一个“get”方法 例如

return InitialFrame.InitialPanel.Buttons;

感谢您的帮助。

错误只是说“找不到符号”是每种情况。

**从现在开始编辑......

这是整个视图包:

public class View {

    InitialFrame initialFrame;

    public View(){

        initialFrame = new InitialFrame();

    }

    public JFrame getInitialFrame() {
        return initialFrame;
    }

    public InitialPanel getInitialPanel() {
       return InitialFrame.getInitialPanel();
    }

    public JButton[] getSignOnButtons() {
        return initialFrame.getInitialPanel().getSignOnButtons();
    }
}

这是 InitialFrame 类:

public final class InitialFrame extends JFrame {

    private final InitialPanel initialPanel;

    public InitialFrame() {

        super("Welcome to the Sign-on Screen");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.setSize(700, 700);
        this.setLayout(new GridLayout(1, 1));

        initialPanel = new InitialPanel();        
        this.add(initialPanel);

        //this.pack();
        this.setLocationRelativeTo(null);
        this.validate();
        this.repaint();
        this.setVisible(true);

        JButton[] test = initialPanel.getSignOnButtons();
        String newStr = initialPanel.getNorthPanel().getTest();    //Call to getTest
    }

    public InitialPanel getInitialPanel() {
        return initialPanel;
    }


}

//InitialPanel ___________

class InitialPanel extends JPanel{

    private BorderLayout InitialPanelLayout;
    private JButton[] signOnButtons;
    private NorthPanel northPanel;
    private JPanel southPanel;
    private JPanel leftPanel;
    private JPanel rightPanel;
    private JPanel centerPanel;
    private JLabel userNameLabel;
    private JTextField userNameTextField;

    public InitialPanel() {

        this.setSize(600, 600);
        InitialPanelLayout = new BorderLayout();
        this.setLayout(InitialPanelLayout);

        this.createPanels();
        this.formatCenterPanel();


        setVisible(true);
        this.validate();
        this.repaint();
    }

    /**
     * Method is to create panels for all the Border Layout of initial Panel
     * @param none
     */
    private void createPanels() {

        //Graphics comp2D = new Graphics();
        //comp2D.drawString("Free the bound periodicals", 22, 100);

        northPanel = new NorthPanel();
        northPanel.setSize(600, 200);
        this.add(northPanel, "North");

        southPanel = new JPanel();
        this.add(southPanel, "South");

        leftPanel = new JPanel();
        this.add(leftPanel, BEFORE_LINE_BEGINS);

        rightPanel = new JPanel();
        this.add(rightPanel, AFTER_LINE_ENDS);

        centerPanel = new JPanel();
        this.add(centerPanel, "Center");

    }

    /**
     * Method is to format the center panel on the opening window.
     * It uses 4 row grid layout, top row is a container with Label and TextField.
     * @param none 
     */
    private void formatCenterPanel() {

        centerPanel.setLayout(new GridLayout(5, 1));
        Container userName = new Container();
        userName.setLayout(new GridLayout(1, 2));
        userNameLabel = new JLabel("UserName: ");
        userName.add(userNameLabel);
        userNameTextField = new JTextField(30);
        userName.add(userNameTextField);

        centerPanel.add(userName);

        signOnButtons = new JButton[3];
        signOnButtons[0] = new JButton("Sign-On");
        signOnButtons[1] = new JButton("Register");
        signOnButtons[2] = new JButton("Exit");

        for (JButton butt: signOnButtons) {
            centerPanel.add(butt);
        }    
        centerPanel.validate();
        centerPanel.repaint();
    }

    public JButton[] getSignOnButtons() {
        return signOnButtons;
    }

    public JTextField getUserNameTextField() {
        return userNameTextField;
    }

    public NorthPanel getNorthPanel() {
        return northPanel;
    }
}

现在全部更新...

只剩下一个错误:“无法从静态上下文引用非静态方法 getInitialPanel()”

在视图类中

public InitialPanel getInitialPanel() {
   return InitialFrame.getInitialPanel();
}

最终编辑: 主要的解决方案是使用“this”关键字。 之后,我可以使用 Controller 链接 3 个或更多方法来检索隐藏在 View Package 中的属性。

例如,在视图类中:

public JButton[] getSignOnButtons() {
    return this.initialFrame.getInitialPanel().getSignOnButtons();
}

**编辑 2018 年 12 月 25 日 this.keyword 每次都不能解决这个问题。这仍然是一个棘手的操作。 有时我只是允许 NetBeans 自己创建方法,因为它说没有找到方法,即使它的名称完全相同。

【问题讨论】:

  • 在此处发布完整错误以及您的 InitialPanelInitialFrame 的类(如果它们是自定义类)
  • 在 View 包中添加了两个类
  • 为什么你的变量名InitialPanel是类型名?
  • 改名了。发布所有视图包:View、InitialFrame、InitalPanel、NorthPanel
  • @AdamMiller 如以下 cmets 所述,更改此 InitialFrame.getInitialPanel();到 this.initialFrame.getInitialPanel();你应该很高兴。 :-)

标签: java method-chaining


【解决方案1】:

方法链的工作方式是从左到右,左方法返回的值必须在类中实现右方法;

例如;

" Hello ".substring(1).trim()

注意这里substring(1) 正在返回String 值,它还在其(String) 类中实现了trim() 方法。

在你的情况下; return InitialFrame.getInitialPanel().getSignOnButtons();

您正在从 getInitialPlane() 方法返回 Initialframe,但在 InitialFrame 类中没有实现 getSignOnButtons()。这就是 JVM 抱怨的原因。

【讨论】:

  • public JButton[] getSignOnButtons() 是 InitialPanel 中的方法
  • 在更新代码之前,它返回 InitialFrame 类而不是 initialFrame 不是对象。这就是它出错的原因。
【解决方案2】:

JPanel 中没有方法getSignOnButtons()。也许它在InitialPanel?如果是这种情况,InitialFrame.getInitialPanel() 的返回类型应该是InitialPanel 而不是JPanel

【讨论】:

  • 顺便说一句,如果您使用 Java 约定并让变量名以小写字母开头,那就不会那么混乱了。
  • 1.我通常使用小写,我现在将其更改。
  • 2.我使用两种返回类型 InitialPanel 和 JPanel,都显示错误
  • 方法是InitialPanel.getSignOnButtons()public吗?
  • 我发布了 InitialPanel。我想我总是使用公共方法。也许我在这里尝试了一对。
【解决方案3】:

发生这种情况是因为您正在尝试执行 JFrame 类中不存在的方法。当您声明这个JFrame InitialFrame; 时,Java 将在编译时检查该方法是否存在于 JFrame 类中。由于它在 JFrame 中不存在,因此您看起来会收到“找不到符号”错误。

此外,请尝试遵循代码标准 - 字段名称应为小写驼峰式,即 intialFrame。

试试下面的代码(虽然我还没有编译过)-

public class View {

    private InitialFrame initialFrame;

    public View(){

        initialFrame = new InitialFrame();

    }

    public JFrame getInitialFrame() {
        return this.initialFrame;
    }

    public JPanel getInitialPanel() {
        return this.initialFrame.getInitialPanel();
    }

    public JButton[] getSignOnButtons() {
        return this.initialFrame.getInitialPanel().getSignOnButtons(); 
    }
}

public final class InitialFrame extends JFrame {

    private InitialPanel initialPanel;

    public InitialFrame() {

        super("Welcome to the Sign-on Screen");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.setSize(700, 700);
        this.setLayout(new GridLayout(1, 1));

        initialPanel = new InitialPanel();        
        this.add(initialPanel);

        //this.pack();
        this.setLocationRelativeTo(null);
        this.validate();
        this.repaint();
        this.setVisible(true);

        JButton[] test = initialPanel.getSignOnButtons();
        String new = initialPanel.getNorthPanel().getTest(); 
    } 

    public JPanel getInitialPanel() {
        return this.initialPanel;
    }


}

我假设您有另一个 InitialPanel 类,它扩展了 JPanel 并在其中定义了 getSignOnButtons() 方法。

【讨论】:

  • 谢谢。而且,我总是使用小写字母,我弄乱了一个,然后我就用了一次。大声笑。
  • @AdamMiller 它会发生一段时间。 :-)
  • 已发布 InitialPanel
  • InitalPanel 类看起来也不合适。北面板 = 新北面板();需要替换为 northPanel = new JPanel();这看起来更像是一个错字。 :-)
  • 对不起!刚刚也看到了你的 NorthPanel 课程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 2021-01-22
  • 2011-04-26
相关资源
最近更新 更多