如何在此Java Swing代码中将GUI与逻辑正确分开

时间:2019-03-07 13:59:30

标签: java swing

我试图学习一些关于带有摆动的GUI界面以及如何正确构造GUI程序的方法,至少当然要以最有效的方式,这取决于项目。

在此示例中,我尝试创建一个执行以下操作的简单程序。

  • 我有一个包含2个按钮的Menu,按下每个按钮都会触发相应的 ActionListener 并创建新类的实例。

  • 每个新类(其中两个的名称是: Journal Seminar )都有自己的GUI代码,该文本由文本字段,按钮和其他挥杆组件。

  • 首先,我在Journal和Seminar的Logic类中拥有了这2个GUI类。但是据我了解,这不是一个好习惯,看来我们需要使未连接的程序组件紧密连接在一起。
  • 因此,现在我尝试将每个GUI方法移至另一个类,并在每个类的构造函数中调用它们。

注意::该程序的最终目的是对象可串行化以归档,因此现在忽略一些与之对应的代码。

该代码目前无法正常工作。

**问题:**

  • 我在整个程序中遵循的方法是否正确?还是我应该找到另一种方法?

  • 我应该学习哪些知识,以便我可以了解如何有效地构建此类应用程序?

  • 如何进行当前工作?

  • 这是我的第一篇文章,所以我尽力以可能的最佳方式提出这个问题,如果您需要更多信息,请告诉我。谢谢!*

非常感谢任何帮助。

菜单类

import javax.swing.*;
    import java.awt.*;
    import java.io.IOException;

public class Menu {

JFrame menu_frame;
JButton ergasia_periodiko_btn = new JButton();
JButton ergasia_sinedrio_btn = new JButton();

Menu() {
    this.menu_frame = new JFrame();
    this.menu_frame.setSize(400,100);
    this.menu_frame.setTitle("Ereunitikos Katalogos");
    this.menu_frame.add(ergasia_periodiko_btn);
    this.menu_frame.add(ergasia_sinedrio_btn);
    this.menu_frame.setLayout(new FlowLayout());
    this.ergasia_periodiko_btn.setText("Periodika");
    this.ergasia_sinedrio_btn.setText("Sinedria");
    this.ergasia_periodiko_btn.addActionListener(e -> new Journal());  //Action Listener to Joyrnal
    this.ergasia_sinedrio_btn.addActionListener(e -> {
        try {
            new Seminar();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }); //Action Listener to Seminar
    this.menu_frame.setLocationRelativeTo(null);
    this.menu_frame.setVisible(true);
}

public static void main(String[] args)
 { new Menu(); }
 }

期刊类

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
 import java.util.List;

public class Journal implements Serializable
{ 
Journal_GUI gui;  //**Creating instance of journal gui inside here so i can run the gui code in the constructor**
String column_title;
List writers = new ArrayList(2);
String mag_title;
String numberOfPages;
String released_date;
String volume;
String exact_page;

 Journal(){}

 public void fillVars()
{
    this.column_title = gui.column_title_tf.getText();
    this.writers = Collections.singletonList(gui.writers_tf.getText());
    this.mag_title = gui.mag_title_tf.getText();
    this.numberOfPages = gui.numberOfPages_tf.getText();
    this.released_date = gui.released_date_tf.getText();
    this.volume = gui.volume_tf.getText();
    this.exact_page = gui.exact_page_tf.getText();
}

public void insertP() {
    fillVars();
   // try {
       // My_Serialization.serialization("fileToSavePeriodiko.txt", this.toString());

   // }// catch (IOException e) {
     //   e.printStackTrace();
    //}
   }

public void searchP_byTitle(){}
public void searchP_byName(){}

@Override
public String toString() {
    String value = "\n Periodiko column title : " + column_title + "\n writers : " + writers+ "\n Titlos magazine : " + mag_title
            + "\n  Number of Pages : " + numberOfPages + "\n Released Date : " + released_date + "\n Volume : " + volume + "\n Exact Page : " + exact_page +"\n";
    return value;
}
 }

Journal Gui类

import javax.swing.*;

public class Journal_GUI extends Journal{

JFrame periodikoFrame;
JTextField column_title_tf;
JTextField writers_tf;
JTextField mag_title_tf;
JTextField numberOfPages_tf;
JTextField released_date_tf;
JTextField volume_tf;
JTextField exact_page_tf;

public Journal_GUI(){
    initComponenets();
}


public void initComponenets() {

    periodikoFrame = new JFrame("PERIODIKA");
    periodikoFrame.setSize(500, 500);
    JPanel panel = new JPanel();
    BoxLayout boxlayout = new BoxLayout(panel, BoxLayout.Y_AXIS);
    panel.setLayout(boxlayout);

    column_title_tf = new JTextField("Column Title");
    writers_tf = new JTextField("Writers");
    mag_title_tf = new JTextField("Magazine's Title");
    numberOfPages_tf = new JTextField("Number of Pages");
    released_date_tf = new JTextField("Date of Release");
    volume_tf = new JTextField("Volume");
    exact_page_tf = new JTextField("Exact Page");

    JButton search_mag_btn_byName = new JButton("Search By name");
    JButton search_mag_btn_byTitle = new JButton("Search By Title");
    JButton insert_mag_btn = new JButton("Insert article");

    search_mag_btn_byName.addActionListener(e -> searchP_byName());
    search_mag_btn_byTitle.addActionListener(e -> searchP_byTitle());
    insert_mag_btn.addActionListener(e -> insertP());

    panel.add(column_title_tf);
    panel.add(writers_tf);
    panel.add(mag_title_tf);
    panel.add(numberOfPages_tf);
    panel.add(released_date_tf);
    panel.add(volume_tf);
    panel.add(exact_page_tf);
    panel.add(search_mag_btn_byName);
    panel.add(search_mag_btn_byTitle);
    panel.add(insert_mag_btn);
    periodikoFrame.setLocationRelativeTo(null);
    periodikoFrame.add(panel);
    periodikoFrame.setVisible(true);
}
 }

2 个答案:

答案 0 :(得分:0)

  • 我在整个程序中遵循的方法是否正确?要么 我应该找到另一种方法吗?

这可能是正确的,但不是最容易理解和开发的

  • 我应该追求哪些知识,以便我能够理解 有效地构建此类应用?

您应该查看https://en.wikipedia.org/wiki/SOLID,尤其是您的情况下的https://en.wikipedia.org/wiki/Dependency_inversion_principle#Model_View_Controllerhttps://en.wikipedia.org/wiki/Single_responsibility_principle。 这应该给您一些提示,提示如何有效地构建应用程序(包括此代码)。

  • 如何使当前作品正常?

您是要序列化对象到文件吗?如果是这种情况,请查看How to write and read java serialized objects into a file

答案 1 :(得分:0)

这只是一个建议,当我第一次开始使用Eclipse WindowsBuilder插件开发基于GUI的桌面应用程序时,它本身会生成代码,您所需要做的就是拖放所需的组件。甚至更好的是,您可以从NetBeans开始使用它,它具有相当不错的GUI内置工具包(拖放),使用它可以了解如何生成自动代码,并以此为基础来擅长在这里尝试做的事情。 >