简体   繁体   English

将 Swing GUI 添加到现有的工作 Java 程序

[英]Adding Swing GUI to existing working java program

i've searched the interwebs for info regarding adding swing GUI to an existing java program, but i'm still a little confused as to how i should make it happen.我已经在互联网上搜索了有关将 Swing GUI 添加到现有 Java 程序的信息,但我仍然对如何实现它感到有些困惑。

I've created a separate class for the form layouts, and can call/open the form window from the main class.我为表单布局创建了一个单独的类,并且可以从主类调用/打开表单窗口。 I got the base code for the GUI off the internet...我从互联网上获得了 GUI 的基本代码......

GUI class:图形界面类:

package gui;

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class MainWindow extends JFrame implements ActionListener {

    private Container c; 
    private JLabel title; 
    private JLabel masterFilePath; 
    private JTextField masterFilePathInput; 
    private JLabel dataFilePath; 
    private JTextField dataFilePathInput; 
    private JButton reset;

    String def = ""; 

    public void mainWindow() {

        setTitle("Count Survey Comparison"); 
        setBounds(300, 90, 900, 600); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        setResizable(false); 

        c = getContentPane(); 
        c.setLayout(null); 

        title = new JLabel("Count Survey Comparison"); 
        title.setFont(new Font("Arial", Font.PLAIN, 30)); 
        title.setSize(500, 30); 
        title.setLocation(300, 30); 
        c.add(title); 

        masterFilePath = new JLabel("Master Data File Location"); 
        masterFilePath.setFont(new Font("Arial", Font.PLAIN, 20)); 
        masterFilePath.setSize(500, 20); 
        masterFilePath.setLocation(80, 100); 
        c.add(masterFilePath); 

        masterFilePathInput = new JTextField(); 
        masterFilePathInput.setFont(new Font("Arial", Font.PLAIN, 15)); 
        masterFilePathInput.setSize(200, 20); 
        masterFilePathInput.setLocation(400, 100); 
        c.add(masterFilePathInput); 

        dataFilePath = new JLabel("Count Survey Data File Location"); 
        dataFilePath.setFont(new Font("Arial", Font.PLAIN, 20)); 
        dataFilePath.setSize(500, 20); 
        dataFilePath.setLocation(80, 150); 
        c.add(dataFilePath); 

        dataFilePathInput = new JTextField(); 
        dataFilePathInput.setFont(new Font("Arial", Font.PLAIN, 15)); 
        dataFilePathInput.setSize(200, 20); 
        dataFilePathInput.setLocation(400, 150); 
        c.add(dataFilePathInput); 

        reset = new JButton("Reset"); 
        reset.setFont(new Font("Arial", Font.PLAIN, 15)); 
        reset.setSize(100, 20); 
        reset.setLocation(270, 450); 
        reset.addActionListener(this); 
        c.add(reset); 

        setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 


    }
}

What should be the actions that go into actionPerformed?进入 actionPerformed 的动作应该是什么?

I can call the class from my main method, and open the form, but i'm stuck as to how to get data from the form itself, and enter them into my existing code (namely the readExcel(...) method)我可以从我的主方法调用该类,并打开表单,但我不知道如何从表单本身获取数据,并将它们输入到我现有的代码中(即 readExcel(...) 方法)

Main Method:主要方法:

MainWindow window = new MainWindow();
            window.mainWindow();

            ReadExcel readExcel = new ReadExcel();
            CompareAndCleanData cleanData = new CompareAndCleanData();
            WriteExcel writeExcel = new WriteExcel();

            /* Change file paths here */

            /* Based on BSTVN Data */
            System.out.println("Read Input Excel Data: In Progress...");
            List<VehicleData> vehicleDataList = readExcel.readExcel(
                    "C:\\Users\\ray.tong\\Desktop\\Count Survey Digitalisation Things\\BSTVN\\Count survey data (PSR19, TBR18).xlsx");
            System.out.println("Read Input Excel Data: Complete");

            /* Read MasterData */
            System.out.println("Read Brand Master Data: In Progress...");
            List<BrandMasterData> brandMasterDataList = readExcel
                    .readBrandMaster("C:\\Users\\ray.tong\\Desktop\\Count Survey Digitalisation Things\\TireMasterData.xlsx");
            System.out.println("Read Brand Master Data: Complete");

            System.out.println("Read Size Master Data: In Progress...");
            List<SizeMasterData> sizeMasterDataList = readExcel
                    .readSizeMaster("C:\\Users\\ray.tong\\Desktop\\Count Survey Digitalisation Things\\TireMasterData.xlsx");
            System.out.println("Read Size Master Data: Complete");

            System.out.println("Read Pattern Master Data: In Progress...");
            List<PatternMasterData> patternMasterDataList = readExcel
                    .readPatternMaster("C:\\Users\\ray.tong\\Desktop\\Count Survey Digitalisation Things\\TireMasterData.xlsx");
            System.out.println("Read Pattern Master Data: Complete");

            System.out.println("Read Vehicle Make/Model Master Data: In Progress...");
            List<VehicleMasterData> vehicleMasterDataList = readExcel
                    .readVehicleMaster("C:\\Users\\ray.tong\\Desktop\\Count Survey Digitalisation Things\\TireMasterData.xlsx");
            System.out.println("Read Vehicle Master Data: Complete");

Any help is appreciated,任何帮助表示赞赏,

Thanks in advance guys.在此先感谢各位。

I would recommend separating the gui from its control by implementing the MVC Pattern .我建议通过实现MVC Pattern将 gui 与其控制分开。
Have a Model class that holds all the information that the view (gui) needs.有一个Model类,其中包含视图 (gui) 需要的所有信息。
Have a View class that uses the model to displays gui.有一个使用模型来显示 gui 的View类。
Have a Controller class that controls the model and view.有一个Controller模型和视图的Controller类。

The following mre demonstrates the use of MVC Pattern with very simple functionality: it allows the user to select a file.以下mre演示了具有非常简单功能的 MVC 模式的使用:它允许用户选择一个文件。 Once file is selected the file name is displayed.选择文件后,将显示文件名。 It can be expanded to include the functionality you need.它可以扩展以包含您需要的功能。
For convenience and simplicity, the following code can be copy-pasted into one file called MVCDemo.java and run:为了方便和简单,可以将以下代码复制粘贴到一个名为MVCDemo.java文件中并运行:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class MVCDemo {

    public static void main(String[] args) {
        Model model = new Model();
        View view = new View();
        new Controller(view, model);
    }
}

/*Model contains the information for the view and information from the view
 * as well as the logic.
 * The model is independent of the user interface.
 */
class Model {

    private String fileName;

    String getFileName() {
        return fileName;
    }

    void setFileName(String fileName) {
        this.fileName = fileName;
    }
}

/*View only contains the user interface part*/
class View {

    private Model model;
    private JFrame frame;
    private JButton selectFileButton;
    private JTextField textField;

    void createAndShowGui(Model model){

        this.model = model;

        frame = new JFrame("MVC Model Demo");
        textField = new JTextField(25);
        //do not use null layout
        frame.add(textField, BorderLayout.NORTH); //JFrame uses BorderLayout by default
        selectFileButton = new JButton("Select File");
        frame.add(selectFileButton, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.pack();
        frame.setVisible(true);
    }

    //may return null
    File getFile(){
        JFileChooser fileChooser = new JFileChooser();
        fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
        // pop up  file chooser dialog
        fileChooser.showOpenDialog(frame);
        return fileChooser.getSelectedFile();
    }

    void update() {
        textField.setText(model.getFileName());
    }

    JButton getSelectFileButton() {
        return selectFileButton;
    }
}

/* The controller controls the view and model.
 * Based on the user action, the Controller calls methods in the View and Model
 * to accomplish the requested action.
 */
class Controller implements ActionListener{

    private final Model model;
    private final View view;

    Controller(View view,Model model) {
        this.model=model;
        this.view=view;
        view.createAndShowGui(model);
        view.getSelectFileButton().addActionListener(this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        File file = view.getFile();
        model.setFileName(file == null  ? "No file selected" : file.getName());
        view.update(); //alternatively use have View listen to Model changes 
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM