Невозможно применить композицию по наследованию в Java Swing - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь использовать композицию вместо наследования при создании компонентов Swing (это означает, что я создал класс, который ничего не расширяет, особенно компонент Swing, такой как JPanel), но я сталкиваюсь с проблемой, связанной сплагин Window Builder для Eclipse, когда я пытаюсь переключиться в режим конструктора моего кода.

Выдает следующее исключение:

Нет корневых методов

Парсер не может найти ни одного корневого метода (ов) (точки входа для разбора).Синтаксический анализатор начинает анализ с известных методов для каждого инструментария GUI.Например, для Swing он начинается с конструктора JPanel или JFrame.Если анализируемый в настоящее время класс не является подклассом компонента Swing, анализатор попытается найти основной метод (java.lang.String []).Если он также не существует, это исключение будет показано.Обычно это означает, что вы пытаетесь проанализировать что-то, что не поддерживается WindowBuilder (например, модуль компиляции без GUI).

Обратите внимание, что даже если WindowBuilder не может автоматически распознать ваш шаблон кода, иногда вы все равно можете научить WindowBuilder работать с ним, предоставив подсказку @ wbp.parser.entryPoint JavaDoc.Например:

public class MyClass {
    /**
     * @wbp.parser.entryPoint
     */
    public void someNonStandardEntryPoint() {
        JFrame frame = new JFrame();
        ...;
    }
}

Затем предлагаются методы, к которым я могу применить вышеупомянутый JavaDoc, но когда я это делаю, ни один из них не приводит к видимому дизайну.Я не создал main() метод, потому что он не имеет никакого смысла в этом контексте.

Ниже приведен класс без подкласса и поддерживающий класс JDialog.Я могу видеть дизайн, если первый класс подклассов JPanel, но я пытаюсь избежать этого.

CustomerAddressesSection.java

package myapp.gui;

import java.awt.Color;
import java.awt.FlowLayout;
import java.util.List;
import java.util.Objects;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

import myapp.models.CustomerAddress;

public class CustomerAddressesSection {
    private JPanel jPanelCustomerAddresses;

    private JPanel panelAbaixoDeCustomerAddresses;
    private JPanel panelTituloEnderecos;
    private JPanel panelContendoOsEnderecos;
    private JLabel lblEnderecos;

    private JScrollPane scrollPaneCustomerAddresses;
    private JList<CustomerAddress> jListCustomerAddresses;

    private final List<CustomerAddress> customerAddresses;

    public CustomerAddressesSection(List<CustomerAddress> customerAddresses) {
        this.customerAddresses = Objects.requireNonNull(customerAddresses);
    }

    public List<CustomerAddress> getCustomerAddresses() {
        return customerAddresses;
    }

    public void layoutCustomerAddressesSection(JPanel panel) {
        jPanelCustomerAddresses = new JPanel();

        jPanelCustomerAddresses.setBackground(new Color(255, 255, 255));
        jPanelCustomerAddresses.setBorder(new CompoundBorder(new LineBorder(new Color(0, 0, 0), 1, true), new EmptyBorder(10, 10, 10, 10)));
        jPanelCustomerAddresses.setLayout(new BoxLayout(jPanelCustomerAddresses, BoxLayout.Y_AXIS));

        panelAbaixoDeCustomerAddresses = new JPanel();
        panelAbaixoDeCustomerAddresses.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
        jPanelCustomerAddresses.add(panelAbaixoDeCustomerAddresses);
        panelAbaixoDeCustomerAddresses.setLayout(new BoxLayout(panelAbaixoDeCustomerAddresses, BoxLayout.Y_AXIS));

        panelTituloEnderecos = new JPanel();
        panelTituloEnderecos.setBorder(new LineBorder(new Color(0, 0, 0), 1, true));
        FlowLayout fl_panelTituloEnderecos = (FlowLayout) panelTituloEnderecos.getLayout();
        fl_panelTituloEnderecos.setAlignment(FlowLayout.LEFT);
        panelTituloEnderecos.setBackground(Color.LIGHT_GRAY);
        panelAbaixoDeCustomerAddresses.add(panelTituloEnderecos);

        lblEnderecos = new JLabel("Endereço");
        panelTituloEnderecos.add(lblEnderecos);

        panelContendoOsEnderecos = new JPanel();
        panelContendoOsEnderecos.setBorder(new EmptyBorder(0, 0, 0, 0));
        panelContendoOsEnderecos.setBackground(Color.WHITE);
        panelAbaixoDeCustomerAddresses.add(panelContendoOsEnderecos);
        panelContendoOsEnderecos.setLayout(new BoxLayout(panelContendoOsEnderecos, BoxLayout.Y_AXIS));

        panel.add(jPanelCustomerAddresses);
    }

    public void addCustomerAddresses() {

        DefaultListModel<CustomerAddress> listModel = new DefaultListModel<>();
        for (CustomerAddress customerAddress : customerAddresses) {
            listModel.addElement(customerAddress);
        }

        jListCustomerAddresses = new JList<>(listModel);
        scrollPaneCustomerAddresses = new JScrollPane(jListCustomerAddresses);
        panelContendoOsEnderecos.add(scrollPaneCustomerAddresses);

        jListCustomerAddresses.setCellRenderer(new PanelIndividualCustomerAddress());
        jListCustomerAddresses.setVisibleRowCount(1);
        //panelContendoOsEnderecos.add(jListCustomerAddresses);
    }

    public static void main(String [] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                MainGUI mainGui = new MainGUI(Collections.emptyList(), null, true);
                CustomerInfo customerInfo = new CustomerInfo("Nome", "Email", LocalDate.now(), "ddd", "phone", "observação");
                List<CustomerAddress> customerAddresses = new ArrayList<CustomerAddress>();
                JDViewCustomer jDViewCustomer = new JDViewCustomer(mainGui, true, mainGui, customerInfo, customerAddresses, Collections.emptyList(), null, 1, 3);
                jDViewCustomer.setVisible(true);
            }
        });
    }
}

JDViewCustomer.java

package myapp.gui;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import javax.swing.BoxLayout;
import javax.swing.JPanel;

import myapp.HttpClient;
import myapp.LoadCustomerOrdersAndGenerateReportWorker;
import myapp.models.CustomerAddress;
import myapp.models.CustomerInfo;
import myapp.models.CustomerOrder;
import net.sf.jasperreports.engine.JRException;

public class JDViewCustomer extends javax.swing.JDialog {

    private static final long serialVersionUID = 1L;

    public static final int CUSTOMER_ORDERS_LIMIT = 10;
    public static final String CUSTOMER_ORDERS_SORT_BY = "created_at";
    public static final String CUSTOMER_ORDERS_SORT_ORDER = "desc";

    private final CustomerInfoSection customerInfoSection;
    private final CustomerAddressesSection customerAddressesSection;
    private final CustomerOrdersSection customerOrdersSection;

    private JPanel panelContainingTheOtherPanels;

    private final MainGUI mainGui;
    private final HttpClient httpClient;
    private final int customerId;

    public JDViewCustomer(java.awt.Frame parent, boolean modal, MainGUI mainGui, CustomerInfo customerInfo,
            List<CustomerAddress> customerAddresses, List<CustomerOrder> customerOrders, HttpClient httpClient,
            int customerId, int maxPage) {
        super(parent, modal);
        this.mainGui = Objects.requireNonNull(mainGui);
        this.customerInfoSection = new CustomerInfoSection(Objects.requireNonNull(customerInfo), this);
        this.customerAddressesSection = new CustomerAddressesSection(Objects.requireNonNull(customerAddresses));
        this.customerOrdersSection = new CustomerOrdersSection(
                (List<CustomerOrder>)(new ArrayList<CustomerOrder>(Objects.requireNonNull(customerOrders))),
                mainGui, httpClient, customerId, this, maxPage);
        this.httpClient = httpClient;
        this.customerId = customerId;

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

        panelContainingTheOtherPanels = new JPanel();
        panelContainingTheOtherPanels.setLayout(new BoxLayout(panelContainingTheOtherPanels, BoxLayout.Y_AXIS));
        getContentPane().add(panelContainingTheOtherPanels);

        customerInfoSection.layoutCustomerDataSection(panelContainingTheOtherPanels);
        customerInfoSection.addCustomerInfo();

        customerAddressesSection.layoutCustomerAddressesSection(panelContainingTheOtherPanels);
        customerAddressesSection.addCustomerAddresses();

        customerOrdersSection.layoutCustomerOrdersSection(panelContainingTheOtherPanels);
        customerOrdersSection.createCustomerOrdersTable();
        customerOrdersSection.updateCurrentPageTextField();

        initComponents();
    }

    public void loadCustomerOrdersAndGenerateReport() throws JRException {
        if (false == customerInfoSection.isLoadingIconShowing()) {
            customerInfoSection.setLoadingIconVisibility(true);

            LoadCustomerOrdersAndGenerateReportWorker worker =
                    new LoadCustomerOrdersAndGenerateReportWorker(httpClient,
                            customerInfoSection.getCustomerInfo(),
                            customerAddressesSection.getCustomerAddresses(),
                            customerId, this);
            mainGui.scheduleOnSingleThread(worker);
        }
    }

    public void updateCustomerOrdersAndPagingInformation(List<CustomerOrder> customerOrders, int total, int page) {
        customerOrdersSection.updateCustomerOrdersAndPagingInformation(customerOrders, total, page);
    }

    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Ver Cliente");

        setMinimumSize(MainGUI.MINIMAL_DISPLAY_DIMENSION);

        pack();

        // Para centralizar o JDialog em relação a seu parent.
        setLocationRelativeTo(getParent());

    }

    public void setLoadingIconVisibility(boolean showing) {
        customerInfoSection.setLoadingIconVisibility(showing);

    }
}
...