Java 如何使方法返回一个面板?

Java 如何使方法返回一个面板?,java,swing,user-interface,jframe,jpanel,Java,Swing,User Interface,Jframe,Jpanel,我正在制作一个带有选项卡式窗格的Java应用程序,我希望一些窗格具有相同的面板布局和结构,我不希望一遍又一遍地编写相同的代码,从而使代码变得混乱,因此我创建了一个方法,返回一个带有我希望窗格具有的结构的JPanel 我正在初始化新变量并将它们带到方法中。我的问题是,在我创建一个面板后,我不能在其中执行任何其他操作,因为它不会显示。我不能添加标签等(尽管如果我在方法中添加标签,它会显示) 我的问题是,是否有可能以某种方式更改我编写的代码,以便在面板返回后更改它 JPanel panel2

我正在制作一个带有选项卡式窗格的Java应用程序,我希望一些窗格具有相同的面板布局和结构,我不希望一遍又一遍地编写相同的代码,从而使代码变得混乱,因此我创建了一个方法,返回一个带有我希望窗格具有的结构的JPanel

我正在初始化新变量并将它们带到方法中。我的问题是,在我创建一个面板后,我不能在其中执行任何其他操作,因为它不会显示。我不能添加标签等(尽管如果我在方法中添加标签,它会显示)

我的问题是,是否有可能以某种方式更改我编写的代码,以便在面板返回后更改它

    JPanel panel2 =  panel2(); // this code bit is in the constructor
    JPanel mainPanel = new JPanel();    //Variables needed to create a panel
    JPanel LeftPanel = new JPanel();
    JPanel RightPanel = new JPanel();
    JSplitPane splitPaneH = new JSplitPane();
    JPanel panelTop = new JPanel();
    JPanel panelBottom = new JPanel();

private JPanel panel2() {
        JPanel newPanel = new JPanel();
        CreateAPanel(newPanel, LeftPanel,RightPanel,splitPaneH, panelTop,panelBottom);
        JLabel label = new JLabel ("lalala");
        LeftPanel.add(label,BorderLayout.CENTER);

        return newPanel;

}

private JPanel CreateAPanel(JPanel mainPanel, JPanel LeftPanel,JPanel RightPanel, JSplitPane splitPaneH, JPanel panelTop, JPanel panelBottom){
        mainPanel.setPreferredSize(new Dimension(1100, 630));
        mainPanel.setLayout(new BorderLayout());

        LeftPanel = new JPanel();
        RightPanel = new JPanel();
        splitPaneH = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        panelTop = new JPanel();
        panelBottom = new JPanel();

        splitPaneH.setTopComponent(panelTop);
        splitPaneH.setBottomComponent(panelBottom);
        splitPaneH.setDividerLocation(300);
        splitPaneH.setPreferredSize(new Dimension(800,630));

        mainPanel.add(LeftPanel, BorderLayout.WEST);
        mainPanel.add(RightPanel,BorderLayout.EAST);
        LeftPanel.setBackground(Color.RED);

        LeftPanel.setPreferredSize(new Dimension (300,630));
        RightPanel.add(splitPaneH);

        return mainPanel;
}

您不使用返回值

您的方法
CreateAPanel(…)
创建所需的面板,但您只是不使用它

您应该像这样调整方法
panel2()

private JPanel panel2() 
{
    //JPanel newPanel = new JPanel(); don't create a new panel!
    //CreateAPanel(newPanel, LeftPanel,RightPanel,splitPaneH, panelTop,panelBottom);
    //instead do this:
    JPanel newPanel = CreateAPanel(newPanel, LeftPanel,RightPanel,splitPaneH, panelTop,panelBottom);
    JLabel label = new JLabel ("lalala");
    LeftPanel.add(label,BorderLayout.CENTER);
    return newPanel;
}

之后完全可以将组件添加到面板对象。您犯的唯一错误是“在方法体中创建新的JPanel实例以替换为原始参数引用”,因此当方法返回时,对原始对象没有影响。我建议做一些不同的事情,比如:

private JPanel[] CreateAPanel(JPanel mainPanel)
    {
        mainPanel.setPreferredSize(new Dimension(1100, 630));
        mainPanel.setLayout(new BorderLayout());

        JPanel leftPanel = new JPanel();
        JPanel rightPanel = new JPanel();
        JSplitPane splitPaneH = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
        JPanel panelTop = new JPanel();
        JPanel panelBottom = new JPanel();

        splitPaneH.setTopComponent(panelTop);
        splitPaneH.setBottomComponent(panelBottom);
        splitPaneH.setDividerLocation(300);
        splitPaneH.setPreferredSize(new Dimension(800,630));

        mainPanel.add(leftPanel, BorderLayout.WEST);
        mainPanel.add(rightPanel,BorderLayout.EAST);
        leftPanel.setBackground(Color.RED);

        leftPanel.setPreferredSize(new Dimension (300,630));
        rightPanel.add(splitPaneH);

        return new JPanel[]{mainPanel, leftPanel, rightPanel, panelTop, panelBottom};
    }

如果要在result JPanel中更改或添加更多组件,您可以在创建组件时为所有组件设置名称:

JPanel newPanel = new JPanel();
newPanel .setName("leftPanel");
resultPanel.add(newPanel, BorderLayout.WEST);
然后,当您获得resultPanel时,您可以获得它的组件:

Component[] componentList = resultPanel.getContentPane().getComponents();
JPanel leftPanel = null;
for (Component component: componentList) {
    if (Objects.equals(component.getName(), "leftPanel")) {
        leftPanel = (JPanel) component;
    }
}

if (leftPanel != null) {
    // do something
}

无关:阅读java命名约定。变量名和方法名在Java中应该是大写的。大写代表类名,因此您的代码对普通java程序员来说是非常容易误导的。如果它返回一个
JPanels
数组,是否应该命名为
createPanels
?是的,应该命名。我只是试着对他们的代码做最小的修改。