Почему этот код не отображает содержимое внутри панели прокрутки с тремя кнопками внизу - PullRequest
1 голос
/ 01 мая 2019

Я установил JFrame видимым в конце моего класса представления и не уверен, почему мои пользовательские JPanels все еще не видны. Я пытаюсь упростить код и избежать огромного класса View, все это при реализации хорошего объектаориентированный стиль программирования.Кнопки J в нижней части JFrame на моей главной панели видны.Я попытался просто добавить пользовательские панели в рамку, но они все еще не видны.

Я попытался установить все на видимое и только добавить пользовательские JPanels в JFrame.

public View(Main pMain) 
{
    setMain(pMain);

    panelClientInfo = new JClientPanel();
    panelPaymentInfo = new JPaymentPanel();
    panelJobDescription = new JJobPanel();
    panelAgreement = new JAgreementPanel();
    clearButton = new JButton("Clear");
    exitButton = new JButton("Exit");
    submitButton = new JButton("Submit");
    panelSecondary = new JPanel();
    panelMain = new JPanel();
    scrollPane = new JScrollPane(panelMain);

    panelSecondary.setLayout(new BoxLayout(panelSecondary, 
    BoxLayout.Y_AXIS));
    panelSecondary.add(panelClientInfo);
    panelSecondary.add(panelJobDescription);
    panelSecondary.add(panelPaymentInfo);
    panelSecondary.add(panelAgreement);
    panelMain.add(panelSecondary, BorderLayout.CENTER);
    panelMain.add(clearButton, BorderLayout.SOUTH);
    panelMain.add(submitButton, BorderLayout.SOUTH);
    panelMain.add(exitButton, BorderLayout.SOUTH);
    scrollPane.add(panelMain);
    scrollPane.setVisible(true);


    setTitle("G.C. Septic Services Contract Drafter");
    setSize(1000, 1000);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    add(scrollPane);

    setVisible(true);


}

/**Here is a custom JPanel that I am trying to use*/
package contractDrafter;
import javax.swing.JPanel;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class JAgreementPanel extends JPanel
{
JPanel panelMain;
JLabel submitterLabel;
JTextField submitterText;

public JAgreementPanel() 
{
    panelMain = new JPanel();
    panelMain.setLayout(new BoxLayout(panelMain, BoxLayout.Y_AXIS));
    submitterLabel = new JLabel("Submitter Name: ");
    submitterText = new JTextField("e.g: Calvin M. Cox", 30);

    panelMain.add(Box.createVerticalGlue());
    panelMain.add(submitterLabel);
    panelMain.add(Box.createVerticalGlue());
    panelMain.add(submitterText);
    panelMain.add(Box.createVerticalGlue());
}

}

Я хочу, чтобы эта программа отображала различные JPanels, так что все, что должна делать моя свекровь, - это введите некоторые значения в законченную программу, и она запишет файлдля нее, чтобы уменьшить нагрузку на ее руки артрита.Я надеюсь, что JPanels окажутся на кадре в полу-аккуратном и аккуратном виде, чтобы она могла прокручивать кадр вверх и вниз и вводить необходимую информацию.

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

ImageofDesiredGui

Итак, я наконец-то понял, что это было. Я хотел бы поблагодарить @OverLoadedBurden за его быстрый ответ и полезность. Я предоставлю только один пользовательский класс JPanel, потому что остальные настолько похожи, что в этом не будет необходимости. Всякий раз, когда я создавал пользовательские JPanels, панели не отображались, потому что я добавлял контент на панель, содержащуюся в пользовательской JPanel. Например, в старом коде я написал:

public JAgreementPanel() 
{
    panelMain = new JPanel();
    panelMain.setLayout(new BoxLayout(panelMain, BoxLayout.Y_AXIS));
    submitterLabel = new JLabel("Submitter Name: ");
    submitterText = new JTextField("e.g: Calvin M. Cox", 30);

    panelMain.add(Box.createVerticalGlue());
    //This is where the error exists
    panelMain.add(submitterLabel);
    panelMain.add(Box.createVerticalGlue());
    //This is where the error exists
    panelMain.add(submitterText);
    panelMain.add(Box.createVerticalGlue());
  }
Whereas I should have been adding the desired content of the panel to the custom 
panel 
itself. This is the new correctly functioning code: 
public JAgreementPanel() 
    {
        panelMain = new JPanel();
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        submitterLabel = new JLabel("Submitter Name: ");
        submitterText = new JTextField("e.g: Calvin M. Cox", 30);
        //this could be also written as "this.add(submitterLabel)"
        add(submitterLabel);
        add(Box.createHorizontalGlue());
        add(submitterText);
        add(Box.createHorizontalGlue());
        setVisible(true);
    }
This could also be accomplished with the code comments as well. I will also include 
the updated view constructor that is called to create the gui:
public View(Main pMain) 
{

    setMain(pMain);

    clearButton = new JButton("Clear");
    exitButton = new JButton("Exit");
    submitButton = new JButton("Submit");
    panelSecondary = new JPanel();
    panelMain = new JPanel();


    panelSecondary.setLayout(new BoxLayout(panelSecondary, BoxLayout.Y_AXIS));

    panelSecondary.add(new JAgreementPanel());

    panelSecondary.add(new JClientPanel());

    panelSecondary.add(new JJobPanel());

    panelSecondary.add(new JPaymentPanel());

    panelMain.setLayout(new GridLayout(2,1));

    panelMain.add(panelSecondary);

    JPanel panelButtons = new JPanel();

    panelButtons.add(exitButton);
    panelButtons.add(clearButton);
    panelButtons.add(submitButton);

    panelMain.add(panelButtons);


    scrollPane = new JScrollPane(panelMain);


    scrollPane.setVisible(true);

    add(panelMain);

    setTitle("G.C. Septic Services Contract Drafter");
    setSize(500, 500);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
} 
0 голосов
/ 03 мая 2019

ваш код содержит много пропущенных классов!когда вы публикуете свой код, по крайней мере, работайте с суперклассами, чтобы мы могли понять, что с ним делать.

в любом случае

Я пытался просто добавить пользовательские панели вкадр, но они все еще не видны.

это противоречит вашему коду!в коде

panelMain.add(panelSecondary, BorderLayout.CENTER);
panelMain.add(clearButton, BorderLayout.SOUTH);
panelMain.add(submitButton, BorderLayout.SOUTH);
panelMain.add(exitButton, BorderLayout.SOUTH);

передаваемые ограничения относятся к BorderLayout, с другой стороны, вы не установили макет на BorderLayout, поэтому по умолчанию это FlowLayout

и снова, даже если было добавлено значение BorderLayout в той же самой «рамке», будет покрыт последний компонент в этой границе!

вы не загрузили изображение, но я могу представить кнопки, расположенные горизонтально пов центре, и это из-за расположения FlowLayout по умолчанию JPanel.

Я надеюсь, что JPanels окажутся на кадре в полугладком и аккуратном виде, так чтоона может прокручивать кадр вверх и вниз и вводить необходимую информацию.

ну, вы делаете панель прокрутки, содержащую панели и кнопки, и это просто неправильно (по крайней мере, в вашейпример проектирования).

то, что вы должны сделать, это что-то вроде

JFrame f = new JFrame();
JPanel slidingPanel = new JPanel ();
slidingPanel.setLayout(new BoxLayout(slidingPanel,BoxLayout.Y_AXSIS));
JScrollPane scrollPane = new JScrollPanel (slidingPanel);
f.getContentPane().add(scrollpane,BorderLayout.CENTER);
//then add all of your panels in the slidingpanel
JPanel buttonPanel = new JPanel();
//i can't give you a hint on this , it's almost just designer choice for how you want your buttons to layout
//but add them to the south !!
f.getContentPane().add(buttonPanel,BorderLayout.SOUTH);

, и если вам все еще нужны дополнительные руки для вашего проекта для вашей семьи, я с радостью помогу вам, но переполнение стекане рдобавьте свой проект в частное репозиторий github или, если у вас уже есть один, пригласите меня, моя учетная запись имеет те же данные, что и моя учетная запись здесь;);

...