Как заставить метод вернуть панель? - PullRequest
0 голосов
/ 21 октября 2019

Я делаю 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;
}

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Впоследствии можно полностью добавить компоненты в объект Panel. Единственная ошибка, которую вы допустили, заключается в том, что «внутри тела метода вы создаете новые экземпляры 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};
    }
0 голосов
/ 21 октября 2019

Если вы хотите изменить или добавить еще несколько компонентов внутри результирующего 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
}
0 голосов
/ 21 октября 2019

вы не используете возвращаемое значение ...

ваш метод 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;
}
...