如何使JAVA方法链接正常工作?

如何使JAVA方法链接正常工作?,java,method-chaining,Java,Method Chaining,我试图做一些简单的方法链接,但总是有错误“找不到符号”的一部分通过。 e、 g: 我正在实现MVC模型,在视图包中我有4个类:View、InitialFrame、InitialPanel、NorthPanel。为了让我的控制器与视图包进行通信,我总是使用View类 我的控制器类需要访问视图类的属性,最好的方法是什么 我以前通过公开所有视图类的属性来“欺骗”它,这样我就可以从视图中创建一个“get”方法 e、 g 谢谢你的帮助 错误只是说“找不到符号”是每种情况 **从这一点往下编辑 这是整个视图

我试图做一些简单的方法链接,但总是有错误“找不到符号”的一部分通过。 e、 g:

我正在实现MVC模型,在视图包中我有4个类:View、InitialFrame、InitialPanel、NorthPanel。为了让我的控制器与视图包进行通信,我总是使用View类

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

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

谢谢你的帮助

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

**从这一点往下编辑

这是整个视图包:

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


}
//初始面板___________

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个或更多方法来检索隐藏在视图包中的属性

例如,在视图类中:

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

方法链从左到右运行,左方法返回的值必须在类中实现右方法

比如,

“你好”。子字符串(1).trim()

请注意,这里的
子字符串(1)
返回
String
值,该值也在其(
String
)类中实现了
trim()
方法

就你而言;
返回InitialFrame.getInitialPanel().getSignOnButtons()


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

JPanel
中没有方法
getSignOnButtons()
。也许它在
初始面板中
?如果是这种情况,
InitialFrame.getInitialPanel()
的返回类型应该是
InitialPanel
,而不是
JPanel
,发生这种情况是因为您试图执行JFrame类中不存在的方法。当您声明此
JFrame InitialFrame时,在编译时Java将检查JFrame类中是否存在该方法。因为它不在JFrame中,所以您可能会遇到“找不到符号”错误

此外,请尝试遵循代码标准-字段名称应采用小写字母,即intialFrame

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



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

在此处发布完整错误以及
InitialPanel
InitialFrame
的类(如果它们是自定义类)在视图包中添加了两个类为什么变量名
InitialPanel
是类型的名称?更改了名称。发布所有视图包:视图、初始框架、初始面板、,NorthPanel@AdamMiller如下面的注释所述,更改此InitialFrame.getInitialPanel();到这个.initialFrame.getInitialPanel();你应该很乐意去。:-)顺便说一句,如果使用Java约定并使变量名以小写字母开头,那么就不会那么容易混淆了。我通常用小写,我现在就改。我使用两种返回类型InitialPanel和JPanel,它们都显示erroris方法
InitialPanel.getSignOnButtons()
public?我发布了InitialPanel。我想我总是使用公开的方法。也许我在这里试过一对,谢谢。而且,我总是用小写,我弄糟了一个,然后我就用了一次。哈哈。@AdamMiller有时候会发生的。:-)发布的InitialPanelInitalPanel类看起来也不合适。northPanel=新的northPanel();需要替换为northPanel=new JPanel();这看起来更像是打字错误。:-)很抱歉刚才也看到了NorthPanel类。public JButton[]getSignOnButtons()是InitialPanel中的方法更新代码之前,它返回的是
InitialFrame
class not
InitialFrame
not对象。这就是它出错的原因。
public InitialPanel getInitialPanel() {
   return InitialFrame.getInitialPanel();
}
public JButton[] getSignOnButtons() {
    return this.initialFrame.getInitialPanel().getSignOnButtons();
}
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;
    }


}