Структурирование моего приложения Java Swing. И.Е. когда и где использовать классы, а не - PullRequest
0 голосов
/ 10 сентября 2018

Я продолжаю добавлять слушатели действий к моим кнопкам и полям Java Swing и т. Д. Я хотел бы знать, где и когда я должен разделить код на классы и различные методы. К сожалению, сейчас мой код кажется одним длинным скриптом, который я привык создавать на Python вместо языка ООП, такого как Java.

Как мне лучше разделить этот код на классы и методы?

Вот код, о котором идет речь:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package business;

import java.awt.BorderLayout;
import java.awt.Color;
import static java.awt.Component.RIGHT_ALIGNMENT;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTree;


/**
 *
 * @author bob
 */
public class NewClass {


    //Initialize GUI elements
    JFrame myFrame = new JFrame();



    JTree jtree1 = new JTree();
    JTree jtree2 = new JTree();

    JLabel label1 = new JLabel("Welcome to the person tester application");
    JLabel label2 = new JLabel("Test2");
    JLabel spacer1 = new JLabel("");
    JLabel spacer2 = new JLabel("");
    //buttons

    JRadioButton radioCustomer = new JRadioButton("Customer");
    JRadioButton radioEmployee = new JRadioButton("Employee");
    ButtonGroup group = new ButtonGroup();
    JButton okButton = new JButton();
    JButton button2 = new JButton("Create");
    JButton button3 = new JButton("EXIT");


    JScrollPane sp = new JScrollPane(jtree1);
    JScrollPane sp2 = new JScrollPane(jtree2);

    //Panels
    JPanel mainPanel = new JPanel(new GridLayout(3,1));
    JPanel panel2 = new JPanel();
    JPanel panel3 = new JPanel(new GridLayout(1,2));
    JPanel panel4 = new JPanel();

    JPanel createPanel = new JPanel();


    //Constructor
    public NewClass(){

    }


    //The createGUI method is inside the class so we can reference the GUI objects created above
    public void createGUI(){

    //Buttons

    button2.setToolTipText("Create");
    button3.setToolTipText("Exit");
    button3.setForeground(Color.red);
    button3.setAlignmentX(RIGHT_ALIGNMENT);
    group.add(radioEmployee);
    group.add(radioCustomer);


    //Adding actionListeners
    GUIListener myListener = new GUIListener();
    okButton.addActionListener(myListener);
    button2.addActionListener(myListener);
    button3.addActionListener(myListener);




    //adding to and customizing the panels


    createPanel.setLayout(new BoxLayout(createPanel, BoxLayout.PAGE_AXIS));
        createPanel.add(radioEmployee);
    createPanel.add(radioCustomer);
    createPanel.add(button2);


    panel2.setLayout(new BoxLayout(panel2, BoxLayout.PAGE_AXIS));
    panel2.add(label1);
    panel2.add(createPanel);



    panel3.add(BorderLayout.CENTER, sp);
    panel3.add(BorderLayout.CENTER, sp2);


    panel4.setLayout(new BoxLayout(panel4, BoxLayout.PAGE_AXIS));
    panel4.add(spacer1);
    panel4.add(button3);





    //adding panels to main panel
    mainPanel.add(panel2);
    mainPanel.add(panel3);
    mainPanel.add(panel4);

    //adding panels we created to the frame


    myFrame.add(mainPanel);



    //setting some parameters to customize the frame

    myFrame.setSize(600, 400);
    myFrame.setLocationRelativeTo(null);

    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    myFrame.setVisible(true);
}



        public class GUIListener implements ActionListener{
        @Override

        public void actionPerformed(ActionEvent e) {

            if (e.getSource() == okButton){
                label1.setText("okButton was pushed!");

            }
            else if (e.getSource() == button2){

            }


            else if (e.getSource() == button3){


               System.out.println("button3 was pusshed");

            }
        }
    }

    //main method that makes the program run
   public static void main(String[] args) {

       //instantiate an object of the NewClass class
       NewClass GUI = new NewClass();

       //Use the method to create and display the GUI
       GUI.createGUI();
   }

}

1 Ответ

0 голосов
/ 10 сентября 2018

Это, само по себе, нелегко сделать, и узнавать, когда вам многое нужно из опыта (о, я помню, когда в прошлый раз я делал это, было ужасно управлять и поддерживать ?), но Есть много доступных шаблонов, которые используются каждый день, чтобы облегчить разработку программного обеспечения и решить повседневные общие проблемы.

Одна вещь, которую вы должны иметь в виду, это то, кто несет ответственность за то, что делать. Например, может оказаться невозможным разделить прослушиватели действий кнопок, поскольку они должны выполнять операции, которые являются внутренними по отношению к самому пользовательскому интерфейсу.

Однако вы могли бы упростить это с помощью Anonymous Classes или даже Actions API , который позволяет изолировать функциональность кнопки

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

В более сложном решении пользовательский интерфейс опирается на «модель», которая отделена от пользовательского интерфейса. Затем пользовательский интерфейс будет предпринимать действия от пользователя и обновлять модель, которая будет внутренне генерировать уведомления, которые пользовательский интерфейс будет использовать для обновления себя, чтобы отразить изменения, см. Model-View-Controller для получения более подробной информации

Итак, каков ответ?

  • Разбейте ваши данные отдельно от пользовательского интерфейса. Используйте один или несколько классов контейнеров / моделей для представления данных. Используйте шаблон наблюдателя , чтобы позволить модели генерировать события, когда происходят изменения, чтобы заинтересованные стороны могли предпринять соответствующие действия
  • Разбейте ваш пользовательский интерфейс на «пригодные для использования» компоненты, где каждый компонент изолирован и отвечает за управление отдельной частью пользовательского интерфейса (и как это происходит, это его собственный бизнес)
  • Я бы также рекомендовал использовать внедрение зависимостей для совместного использования объектов между разделенными элементами, это позволит вам изолировать и протестировать отдельные области вашего кода, бонус, который также приводит к ...
  • Разработка через тестирование (TDD) . Знайте, что и как вы хотите протестировать, прежде чем пытаться создать его
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...