日撸java三百行day77-79

news2024/12/28 20:32:16

文章目录

  • 说明
  • GUI
    • 1. GUI 总体布局
    • 2. GUI 代码理解
      • 2.1 对话框相关控件
        • 2.1.1 ApplicationShowdown.java(关闭应用程序)
        • 2.1.2 DialogCloser.java(关闭对话框)
        • 2.1.3 ErrorDialog.java(显示错误信息)
        • 2.1.4 HelpDialog.java(显示帮助信息)
        • 2.1.5 GUICommon.java (通用的 GUI 配置信息和变量)
      • 2.2 数据读取控件
        • 2.2.1 DoubleField.java(输入功能的文本字段且只能输入double类型)
        • 2.2.2 IntegerField.java(输入功能的文本字段且只能输入int类型)
        • 2.2.2 FilenameField.java(输入功能的文本字段且用于输入文件名或文件路径)
      • 2.3 整体布局GUI
      • 2.4 总结

说明

闵老师的文章链接: 日撸 Java 三百行(总述)_minfanphd的博客-CSDN博客
自己也把手敲的代码放在了github上维护:https://github.com/fulisha-ok/sampledata

GUI

1. GUI 总体布局

我是copy代码直接运行了GUI的一个总体代码,最后运行的界面如下,这个界面实现了灵活输入参数(神经层数,激活函数,训练次数等。点击OK即可完成一次)再执行神经网络的训练和测试(其中训练的方式以及前向传播函数和后向传播函数都是调用的通用神经网络的方法)
在这里插入图片描述
在这里插入图片描述

2. GUI 代码理解

在看了一个整体的思路,在来详细看代码类。

2.1 对话框相关控件

2.1.1 ApplicationShowdown.java(关闭应用程序)

package machinelearing.gui;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

/**
 * @author: fulisha
 * @date: 2023/7/17 15:39
 * @description:
 */
public class ApplicationShutdown implements WindowListener, ActionListener {
    /**
     * Only one instance.
     */
    public static ApplicationShutdown applicationShutdown = new ApplicationShutdown();

    private ApplicationShutdown() {
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }

    @Override
    public void windowOpened(WindowEvent e) {

    }

    @Override
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    @Override
    public void windowClosed(WindowEvent e) {

    }

    @Override
    public void windowIconified(WindowEvent e) {

    }

    @Override
    public void windowDeiconified(WindowEvent e) {

    }

    @Override
    public void windowActivated(WindowEvent e) {

    }

    @Override
    public void windowDeactivated(WindowEvent e) {

    }
}

  1. 实现了WindowListener和ActionListener接口(java中,继承只能单继承,但能多实现)主要处理程序的关闭事件,并提供了在窗口关闭时退出应用程序的功能
  2. 从代码中可以知道 虽然重写了很多方法,但实际上主要是actionPerformed和windowClosing方法,实现了System.exit(0);来终止应用程序,使其退出
  3. 这个类使用了单例模式(23种设计模式中的一种)
    它确保一个类只有一个实例,并提供全局访问点以访问该实例。所以ApplicationShutdown 这个类就是一个单例模式的实现。常见的实现方式
  • 懒汉式,线程不安全
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
  • 懒汉式,线程安全
public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
    public static synchronized Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}
  • 饿汉式
public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

2.1.2 DialogCloser.java(关闭对话框)

package machinelearing.gui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

/**
 * @author: fulisha
 * @date: 2023/7/17 15:41
 * @description:
 */
public class DialogCloser extends WindowAdapter implements ActionListener {
    /**
     * The dialog under control.
     */
    private Dialog currentDialog;

    /**
     * The first constructor.
     */
    public DialogCloser() {
        super();
    }

    /**
     * The second constructor.
     *
     * @param paraDialog the dialog under control
     */
    public DialogCloser(Dialog paraDialog) {
        currentDialog = paraDialog;
    }

    /**
     * Close the dialog which clicking the cross at the up-right corner of the window.
     * @param paraWindowEvent  From it we can obtain which window sent the message because X was used.
     */
    @Override
    public void windowClosing(WindowEvent paraWindowEvent) {
        paraWindowEvent.getWindow().dispose();
    }

    /**
     * Close the dialog while pushing an "OK" or "Cancel" button.
     * @param paraEvent Not considered.
     */
    @Override
    public void actionPerformed(ActionEvent paraEvent) {
        currentDialog.dispose();
    }
}

  1. 实现了 WindowAdapter 和 ActionListener 接口,用于监听对话框的关闭事件
  2. 重写windowClosing方法,当用户点击对话框的关闭按钮触发WindowEvent事件(通常是对话框的上右角的“X”按钮)时,会触发该方法。在此方法中,通paraWindowEvent.getWindow().dispose(); 来关闭对话框; 重写actionPerformed方法,监听ActionEvent事件触发currentDialog.dispose()来关闭对话框

2.1.3 ErrorDialog.java(显示错误信息)

package machinelearing.gui;

import java.awt.*;

/**
 * @author: fulisha
 * @date: 2023/7/17 16:04
 * @description:
 */
public class ErrorDialog  extends Dialog{
    /**
     * Serial uid. Not quite useful.
     */
    private static final long serialVersionUID = 124535235L;

    /**
     * The ONLY ErrorDialog.
     */
    public static ErrorDialog errorDialog = new ErrorDialog();

    /**
     * The label containing the message to display.
     */
    private TextArea messageTextArea;

    /**
     ***************************
     * Display an error dialog and respective error message. Like other dialogs,
     * this constructor is private, such that users can use only one dialog,
     * i.e., ErrorDialog.errorDialog to display message. This is helpful for
     * saving space (only one dialog) since we may need "many" dialogs.
     ***************************
     */
    private ErrorDialog(){
        // This dialog is module.
        super(GUICommon.mainFrame, "Error", true);

        // Prepare for the dialog.
        messageTextArea = new TextArea();

        Button okButton = new Button("OK");
        okButton.setSize(20, 10);
        okButton.addActionListener(new DialogCloser(this));
        Panel okPanel = new Panel();
        okPanel.setLayout(new FlowLayout());
        okPanel.add(okButton);

        // Add TextArea and Button
        setLayout(new BorderLayout());
        add(BorderLayout.CENTER, messageTextArea);
        add(BorderLayout.SOUTH, okPanel);

        setLocation(200, 200);
        setSize(500, 200);
        addWindowListener(new DialogCloser());
        setVisible(false);
    }

    /**
     * set message.
     * @param paramMessage the new message
     */
    public void setMessageAndShow(String paramMessage) {
        messageTextArea.setText(paramMessage);
        setVisible(true);
    }
}

  1. 这个类也采用了单例模式,也是只有一个实例
  2. 构造函数创建了一个对话框,用于显示错误信息和"OK"按钮

2.1.4 HelpDialog.java(显示帮助信息)

package machinelearing.gui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * @author: fulisha
 * @date: 2023/7/17 15:44
 * @description:
 */
public class HelpDialog extends Dialog implements ActionListener {
    /**
     * Serial uid. Not quite useful.
     */
    private static final long serialVersionUID = 3869415040299264995L;

    /**
     * Display the help dialog.
     *
     * @param paraTitle the title of the dialog.
     * @param paraFilename   the help file.
     */
    public HelpDialog(String paraTitle, String paraFilename) {
        super(GUICommon.mainFrame, paraTitle, true);
        setBackground(GUICommon.MY_COLOR);

        TextArea displayArea = new TextArea("", 10, 10, TextArea.SCROLLBARS_VERTICAL_ONLY);
        displayArea.setEditable(false);
        String textToDisplay = "";
        try {
            RandomAccessFile helpFile = new RandomAccessFile(paraFilename, "r");
            String tempLine = helpFile.readLine();
            while (tempLine != null) {
                textToDisplay = textToDisplay + tempLine + "\n";
                tempLine = helpFile.readLine();
            }
            helpFile.close();
        } catch (IOException ee) {
            dispose();
            ErrorDialog.errorDialog.setMessageAndShow(ee.toString());
        }
        // Use this if you need to display Chinese. Consult the author for this
        // method.
        // textToDisplay = SimpleTools.GB2312ToUNICODE(textToDisplay);
        displayArea.setText(textToDisplay);
        displayArea.setFont(new Font("Times New Romans", Font.PLAIN, 14));

        Button okButton = new Button("OK");
        okButton.setSize(20, 10);
        okButton.addActionListener(new DialogCloser(this));
        Panel okPanel = new Panel();
        okPanel.setLayout(new FlowLayout());
        okPanel.add(okButton);

        // OK Button
        setLayout(new BorderLayout());
        add(BorderLayout.CENTER, displayArea);
        add(BorderLayout.SOUTH, okPanel);

        setLocation(120, 70);
        setSize(500, 400);
        addWindowListener(new DialogCloser());
        setVisible(false);
    }

    /**
     * Simply set it visible.
     */
    @Override
    public void actionPerformed(ActionEvent ee) {
        setVisible(true);
    }
}

2.1.5 GUICommon.java (通用的 GUI 配置信息和变量)

package machinelearing.gui;

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

/**
 * @author: fulisha
 * @date: 2023/7/17 15:43
 * @description:
 */
public class GUICommon {
    /**
     * Only one main frame.
     */
    public static Frame mainFrame = null;

    /**
     * Only one main pane.
     */
    public static JTabbedPane mainPane = null;

    /**
     * For default project number.
     */
    public static int currentProjectNumber = 0;

    /**
     * Default font.
     */
    public static final Font MY_FONT = new Font("Times New Romans", Font.PLAIN, 12);

    /**
     * Default color
     */
    public static final Color MY_COLOR = Color.lightGray;

    /**
     * Set the main frame. This can be done only once at the initialzing stage.
     * @param paraFrame the main frame of the GUI.
     * @throws Exception If the main frame is set more than once.
     */
    public static void setFrame(Frame paraFrame) throws Exception {
        if (mainFrame == null) {
            mainFrame = paraFrame;
        } else {
            throw new Exception("The main frame can be set only ONCE!");
        }
    }

    /**
     * Set the main pane. This can be done only once at the initialzing stage.
     * @param paramPane the main pane of the GUI.
     * @throws Exception  If the main panel is set more than once.
     */
    public static void setPane(JTabbedPane paramPane) throws Exception {
        if (mainPane == null) {
            mainPane = paramPane;
        } else {
            throw new Exception("The main panel can be set only ONCE!");
        }
    }
}

2.2 数据读取控件

2.2.1 DoubleField.java(输入功能的文本字段且只能输入double类型)

package machinelearing.gui;

import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

/**
 * @author: fulisha
 * @date: 2023/7/17 16:10
 * @description:
 */
public class DoubleField extends TextField implements FocusListener {

    /**
     * Serial uid. Not quite useful.
     */
    private static final long serialVersionUID = 363634723L;

    /**
     * The value
     */
    protected double doubleValue;

    /**
     * Give it default values.
     */
    public DoubleField() {
        this("5.13", 10);
    }
    /**
     * Only specify the content.
     * @param paraString The content of the field.
     */
    public DoubleField(String paraString) {
        this(paraString, 10);
    }

    /**
     * Only specify the width.
     * @param paraWidth  The width of the field.
     */
    public DoubleField(int paraWidth) {
        this("5.13", paraWidth);
    }

    /**
     * Specify the content and the width.
     * @param paraString The content of the field.
     * @param paraWidth The width of the field.
     */
    public DoubleField(String paraString, int paraWidth) {
        super(paraString, paraWidth);
        addFocusListener(this);
    }

    /**
     * Implement FocusListener.
     * @param paraEvent  The event is unimportant.
     */
    @Override
    public void focusGained(FocusEvent paraEvent) {
    }

    /**
     * Implement FocusListener.
     * @param paraEvent The event is unimportant.
     */
    @Override
    public void focusLost(FocusEvent paraEvent) {
        try {
            doubleValue = Double.parseDouble(getText());
        } catch (Exception ee) {
            ErrorDialog.errorDialog
                    .setMessageAndShow("\"" + getText() + "\" Not a double. Please check.");
            requestFocus();
        }
    }

    /**
     * Get the double value.
     * @return the double value.
     */
    public double getValue() {
        try {
            doubleValue = Double.parseDouble(getText());
        } catch (Exception ee) {
            ErrorDialog.errorDialog
                    .setMessageAndShow("\"" + getText() + "\" Not a double. Please check.");
            requestFocus();
        }
        return doubleValue;
    }
}

  1. 重写focusLost方法(当文本字段失去焦点时触发):将输入的文本转换为 double 类型的值,并将其存储在 doubleValue 变量中,如果失败调用ErrorDialog显示错误信息
  2. 自定义方法getValue,用于获取文本字段中输入的浮点数值

2.2.2 IntegerField.java(输入功能的文本字段且只能输入int类型)

和DoubleField同理

package machinelearing.gui;

import java.awt.*;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

/**
 * @author: fulisha
 * @date: 2023/7/17 16:12
 * @description:
 */
public class IntegerField extends TextField implements FocusListener {
    /**
     * Serial uid. Not quite useful.
     */
    private static final long serialVersionUID = -2462338973265150779L;

    /**
     * Only specify the content.
     */
    public IntegerField() {
        this("513");
    }

    /**
     * Specify the content and the width.
     * @param paraString  The default value of the content.
     * @param paraWidth The width of the field.
     */
    public IntegerField(String paraString, int paraWidth) {
        super(paraString, paraWidth);
        addFocusListener(this);
    }

    /**
     * Only specify the content.
     * @param paraString The given default string.
     */
    public IntegerField(String paraString) {
        super(paraString);
        addFocusListener(this);
    }

    /**
     * Only specify the width.
     * @param paraWidth  The width of the field.
     */
    public IntegerField(int paraWidth) {
        super(paraWidth);
        setText("513");
        addFocusListener(this);
    }

    /**
     * Implement FocusListenter.
     * @param paraEvent The event is unimportant.

     */
    @Override
    public void focusGained(FocusEvent paraEvent) {
    }

    /**
     * Implement FocusListenter.
     * @param paraEvent   The event is unimportant.
     */
    @Override
    public void focusLost(FocusEvent paraEvent) {
        try {
            Integer.parseInt(getText());
            // System.out.println(tempInt);
        } catch (Exception ee) {
            ErrorDialog.errorDialog.setMessageAndShow("\"" + getText()
                    + "\"Not an integer. Please check.");
            requestFocus();
        }
    }

    /**
     * Get the int value. Show error message if the content is not an int.
     * @return the int value.
     */
    public int getValue() {
        int tempInt = 0;
        try {
            tempInt = Integer.parseInt(getText());
        } catch (Exception ee) {
            ErrorDialog.errorDialog.setMessageAndShow("\"" + getText()
                    + "\" Not an int. Please check.");
            requestFocus();
        }
        return tempInt;
    }
}

2.2.2 FilenameField.java(输入功能的文本字段且用于输入文件名或文件路径)

package machinelearing.gui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.File;

/**
 * @author: fulisha
 * @date: 2023/7/17 16:14
 * @description:一个带有文件选择功能的文本输入框,用于方便用户选择文件路径,并将选择的文件路径显示在文本输入框中。它还具有一些对文本内容的处理,如检查文件是否存在并显示错误消息等。
 */
public class FilenameField extends TextField implements ActionListener,
        FocusListener{
    /**
     * Serial uid. Not quite useful.
     */
    private static final long serialVersionUID = 4572287941606065298L;

    /**
     * No special initialization..
     */
    public FilenameField() {
        super();
        setText("");
        addFocusListener((FocusListener) this);
    }

    /**
     * No special initialization.
     * @param paraWidth The width of the .
     */
    public FilenameField(int paraWidth) {
        super(paraWidth);
        setText("");
        addFocusListener(this);
    }// Of constructor

    /**
     * No special initialization.
     * @param paraWidth The width of the .
     * @param paraText  The given initial text
     */
    public FilenameField(int paraWidth, String paraText) {
        super(paraWidth);
        setText(paraText);
        addFocusListener(this);
    }

    /**
     * No special initialization.
     * @param paraWidth The width of the .
     * @param paraText The given initial text
     */
    public FilenameField(String paraText, int paraWidth) {
        super(paraWidth);
        setText(paraText);
        addFocusListener(this);
    }

    /**
     * Avoid setting null or empty string.
     * @param paraText The given text.
     */
    @Override
    public void setText(String paraText) {
        if (paraText.trim().equals("")) {
            super.setText("unspecified");
        } else {
            super.setText(paraText.replace('\\', '/'));
        }
    }

    /**
     * Implement ActionListenter.
     * @param paraEvent The event is unimportant.
     */
    @Override
    public void actionPerformed(ActionEvent paraEvent) {
        FileDialog tempDialog = new FileDialog(GUICommon.mainFrame,
                "Select a file");
        tempDialog.setVisible(true);
        if (tempDialog.getDirectory() == null) {
            setText("");
            return;
        }

        String directoryName = tempDialog.getDirectory();

        String tempFilename = directoryName + tempDialog.getFile();
        //System.out.println("tempFilename = " + tempFilename);

        setText(tempFilename);
    }

    /**
     * Implement FocusListenter.
     * @param paraEvent  The event is unimportant.
     */
    @Override
    public void focusGained(FocusEvent paraEvent) {
    }

    /**
     * Implement FocusListenter.
     * @param paraEvent The event is unimportant.
     */
    @Override
    public void focusLost(FocusEvent paraEvent) {
        // System.out.println("Focus lost exists.");
        String tempString = getText();
        if ((tempString.equals("unspecified"))
                || (tempString.equals("")))
            return;
        File tempFile = new File(tempString);
        if (!tempFile.exists()) {
            ErrorDialog.errorDialog.setMessageAndShow("File \"" + tempString
                    + "\" not exists. Please check.");
            requestFocus();
            setText("");
        }
    }
}

  1. 实现actionPerformed方法,该方法打开文件选择对话框,让用户选择文件,并将选中的文件名或文件路径设置为文本字段的内容
  2. 实现focusLost方法(当文本字段失去焦点时触发),检查文本字段的内容是否为空或为 "unspecified"如果是则返回反之它会检查检查文件是否存在,若不存在,则调用ErrorDialog来显示错误信息。

2.3 整体布局GUI

package machinelearing.gui;

import machinelearing.ann.FullAnn;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

/**
 * @author: fulisha
 * @date: 2023/7/18 16:02
 * @description:
 */
public class AnnMain implements ActionListener {
    /**
     * Select the arff file.
     */
    private FilenameField arffFilenameField;

    /**
     * The setting of alpha.
     */
    private DoubleField alphaField;

    /**
     * The setting of alpha.
     */
    private DoubleField betaField;

    /**
     * The setting of alpha.
     */
    private DoubleField gammaField;

    /**
     * Layer nodes, such as "4, 8, 8, 3".
     */
    private TextField layerNodesField;

    /**
     * Activators, such as "ssa".
     */
    private TextField activatorField;

    /**
     * The number of training rounds.
     */
    private IntegerField roundsField;

    /**
     * The learning rate.
     */
    private DoubleField learningRateField;

    /**
     * The mobp.
     */
    private DoubleField mobpField;

    /**
     * The message area.
     */
    private TextArea messageTextArea;

    /**
     * The only constructor.
     */
    public AnnMain() {
        // A simple frame to contain dialogs.
        Frame mainFrame = new Frame();
        mainFrame.setTitle("ANN");
        // The top part: select arff file.
        arffFilenameField = new FilenameField(30);
        arffFilenameField.setText("D:/sampledata/sampledata/src/data/iris.arff");
        Button browseButton = new Button(" Browse ");
        browseButton.addActionListener(arffFilenameField);

        Panel sourceFilePanel = new Panel();
        sourceFilePanel.add(new Label("The .arff file:"));
        sourceFilePanel.add(arffFilenameField);
        sourceFilePanel.add(browseButton);

        // Setting panel.
        Panel settingPanel = new Panel();
        settingPanel.setLayout(new GridLayout(3, 6));

        settingPanel.add(new Label("alpha"));
        alphaField = new DoubleField("0.01");
        settingPanel.add(alphaField);

        settingPanel.add(new Label("beta"));
        betaField = new DoubleField("0.02");
        settingPanel.add(betaField);

        settingPanel.add(new Label("gamma"));
        gammaField = new DoubleField("0.03");
        settingPanel.add(gammaField);

        settingPanel.add(new Label("layer nodes"));
        layerNodesField = new TextField("4, 8, 8, 3");
        settingPanel.add(layerNodesField);

        settingPanel.add(new Label("activators"));
        activatorField = new TextField("sss");
        settingPanel.add(activatorField);

        settingPanel.add(new Label("training rounds"));
        roundsField = new IntegerField("5000");
        settingPanel.add(roundsField);

        settingPanel.add(new Label("learning rate"));
        learningRateField = new DoubleField("0.01");
        settingPanel.add(learningRateField);

        settingPanel.add(new Label("mobp"));
        mobpField = new DoubleField("0.5");
        settingPanel.add(mobpField);

        Panel topPanel = new Panel();
        topPanel.setLayout(new BorderLayout());
        topPanel.add(BorderLayout.NORTH, sourceFilePanel);
        topPanel.add(BorderLayout.CENTER, settingPanel);

        messageTextArea = new TextArea(80, 40);

        // The bottom part: ok and exit
        Button okButton = new Button(" OK ");
        okButton.addActionListener(this);
        // DialogCloser dialogCloser = new DialogCloser(this);
        Button exitButton = new Button(" Exit ");
        // cancelButton.addActionListener(dialogCloser);
        exitButton.addActionListener(ApplicationShutdown.applicationShutdown);
        Button helpButton = new Button(" Help ");
        helpButton.setSize(20, 10);
        helpButton.addActionListener(new HelpDialog("ANN", "D:/sampledata/sampledata/src/data/help.txt"));
        Panel okPanel = new Panel();
        okPanel.add(okButton);
        okPanel.add(exitButton);
        okPanel.add(helpButton);

        mainFrame.setLayout(new BorderLayout());
        mainFrame.add(BorderLayout.NORTH, topPanel);
        mainFrame.add(BorderLayout.CENTER, messageTextArea);
        mainFrame.add(BorderLayout.SOUTH, okPanel);

        mainFrame.setSize(600, 500);
        mainFrame.setLocation(100, 100);
        mainFrame.addWindowListener(ApplicationShutdown.applicationShutdown);
        mainFrame.setBackground(GUICommon.MY_COLOR);
        mainFrame.setVisible(true);
    }

    /**
     * Read the arff file.
     */
    @Override
    public void actionPerformed(ActionEvent ae) {
        String tempFilename = arffFilenameField.getText();

        // Read the layers nodes.
        String tempString = layerNodesField.getText().trim();

        int[] tempLayerNodes = null;
        try {
            tempLayerNodes = stringToIntArray(tempString);
        } catch (Exception ee) {
            ErrorDialog.errorDialog.setMessageAndShow(ee.toString());
            return;
        }

        double tempLearningRate = learningRateField.getValue();
        double tempMobp = mobpField.getValue();
        String tempActivators = activatorField.getText().trim();
        FullAnn tempNetwork = new FullAnn(tempFilename, tempLayerNodes, tempLearningRate, tempMobp,
                tempActivators);
        int tempRounds = roundsField.getValue();

        long tempStartTime = new Date().getTime();
        for (int i = 0; i < tempRounds; i++) {
            tempNetwork.train();
        }
        long tempEndTime = new Date().getTime();
        messageTextArea.append("\r\nSummary:\r\n");
        messageTextArea.append("Trainng time: " + (tempEndTime - tempStartTime) + "ms.\r\n");

        double tempAccuray = tempNetwork.test();
        messageTextArea.append("Accuracy: " + tempAccuray + "\r\n");
        messageTextArea.append("End.");
    }

    /**
     * Convert a string with commas into an int array.
     * @param paraString The source string
     * @return An int array.
     * @throws Exception Exception for illegal data.
     */
    public static int[] stringToIntArray(String paraString) throws Exception {
        int tempCounter = 1;
        for (int i = 0; i < paraString.length(); i++) {
            if (paraString.charAt(i) == ',') {
                tempCounter++;
            }
        }

        int[] resultArray = new int[tempCounter];

        String tempRemainingString = new String(paraString) + ",";
        String tempString;
        for (int i = 0; i < tempCounter; i++) {
            tempString = tempRemainingString.substring(0, tempRemainingString.indexOf(",")).trim();
            if (tempString.equals("")) {
                throw new Exception("Blank is unsupported");
            }

            resultArray[i] = Integer.parseInt(tempString);

            tempRemainingString = tempRemainingString
                    .substring(tempRemainingString.indexOf(",") + 1);
        }

        return resultArray;
    }

    /**
     * The entrance method.
     * @param args The parameters.
     */
    public static void main(String args[]) {
        new AnnMain();
    }
}

AnnMain构造方法,是程序的入口方法,他初始化 GUI 界面并添加监听事件。所以从这个构造方法去了解这些代码

  1. mainFrame 来包含所有的对话框
  2. FilenameField实例化对象:arffFilenameField用于选择输入文件,将 arffFilenameField 对象注册为按钮 browseButton 的事件监听器
  3. 创建 Panel 面板 sourceFilePanel,主要用来放文件选择和按钮 在这里插入图片描述
  4. 创建 Panel 面板 settingPanel,并且采用网格布局(代码中是3行6列),并将DoubleField、TextField,IntegerField对象排列在一起,这些都是神经网络的参数 在这里插入图片描述
  5. 创建一个 TextArea 对象 messageTextArea,用于显示训练过程和结果的信息
  6. 创建 “OK” 按钮 okButton,并将 this 对象注册为它的事件监听器,这里的this就是当前对象ANN实例化的整个对象;创建 Exit按钮 exitButton并把ApplicationShutdown对象注册上去,创建 Help 按钮 helpButton,并将HelpDialog对象注册到这个按钮上。并创建 Panel 面板 okPanel,把这三个按钮都放上去 在这里插入图片描述
  7. 利用mainFrame 把所有的面板组件都放上去就成了如下: 在这里插入图片描述

2.4 总结

今天学习的GUI 是 创建了一个包含输入和输出界面的 GUI 窗口,并为界面上的按钮注册了相应的事件监听器,当用户输入参数后,点击 OK 按钮可以神经网络训练和测试(这里的方法都是FullAnn里面的),点击 Exit 按钮可以退出程序,点击 Help 按钮可以查看帮助信息。今天的代码主要是学习的GUI布局,而关于神经网络学习是之前已经学习的知识(FullAnn类),可再巩固。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771033.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础算法离散化及区间合并篇

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要讲解了双指针&#xff0c;位运算&#xff0c;离散化以及区间合并。…

店铺记账用什么软件好?应该如何选购?

店铺记账过程中&#xff0c;会遇到各种问题&#xff1a;手写记账容易出错、效率低下、数据容易丢失&#xff1b;手动整理数据导致实际库存和账面库存不匹配&#xff0c;影响补货和订单管理。 而借助专业的店铺记账软件&#xff0c;可以有效解决上面这些问题&#xff0c;通过自动…

51单片机学习--矩阵键盘、电子密码锁

矩阵键盘的模块原理图&#xff1a; 功能&#xff1a;按下矩阵按键&#xff0c;在LCD上显示对应的数值。 采用模块化编程&#xff0c;在此只给出MatrixKey.c 和 main.c 两部分代码 #include <REGX52.H> #include "Delay.h"/*矩阵键盘读取键码按下不放&#xf…

K8S集群内部署Rancher2.5.16

K8S集群内部署Rancher2.5.16 一、环境 k8s&#xff1a;1.18.20 OS&#xff1a;Anolis OS 7.9 rancher&#xff1a;2.5.16 参考官网部署文档&#xff1a;https://ranchermanager.docs.rancher.com/zh/v2.6/pages-for-subheaders/install-upgrade-on-a-kubernetes-cluster 二…

回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于SVM-Adaboost支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于SVM-Adaboost支持向…

Meta发布升级大模型LLaMA 2:开源可商用

论文地址&#xff1a;https://ai.meta.com/research/publications/llama-2-open-foundation-and-fine-tuned-chat-models/ Github地址&#xff1a;https://github.com/facebookresearch/llama LLaMA 2介绍 Meta之前发布自了半开源的大模型LLaMA&#xff0c;自从LLaMA发布以来…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…

spring starter

统一返回参数 public class R {private Integer code;private String msg;private Object obj;public static R build() {return new R();}public static R ok(String msg) {return new R(200, msg, null);}public static R ok(String msg, Object obj) {return new R(200, msg…

Spring学习记录---回顾反射机制

目录 10.回顾反射机制 10.1 分析方法四要素 //不使用反射机制调用这些方法 使用反射机制调用方法 代码&#xff1a; 运行结果&#xff1a; 10.4 假设你知道属性名 测试代码 运行结果 10.回顾反射机制 10.1 分析方法四要素 package com.dong.reflect;public class Som…

深入学习 Redis - 深挖经典数据类型之 string

目录 前言 一、string 类型 1.1、操作命令 set / get &#xff08;设置 / 获取&#xff09; mset / mget&#xff08;批量 > 设置 / 获取&#xff09; setnx / setex / psetex &#xff08;设置时指定不同方式&#xff09; incr / incrby / decr / decrby/ incrbyfloat…

GAMES101作业2

文章目录 作业内容Step 1. 创建三角形的2维bounding boxStep 2. 判断bBox中的像素中心点是否在三角形内Step 3. 比较插值深度和Depth BufferMSAA 作业内容 在屏幕上画出一个实心三角形&#xff0c; 换言之&#xff0c;栅格化一个三角形。上一次作业中&#xff0c;在视口变化之…

P1403 [AHOI2005] 约数研究

题目描述 科学家们在 Samuel 星球上的探险得到了丰富的能源储备&#xff0c;这使得空间站中大型计算机 Samuel II 的长时间运算成为了可能。由于在去年一年的辛苦工作取得了不错的成绩&#xff0c;小联被允许用 Samuel II 进行数学研究。 小联最近在研究和约数有关的问题&…

Vue+axios 使用CancelToken多次发送请求取消前面所有正在pendding的请求

需求&#xff1a; 项目中 折线图数据是循环调用的&#xff0c;此时勾选一个设备&#xff0c; 会出现多条线。 原因 折线图数据一进来接口循环在调用&#xff0c;勾选设备时&#xff0c;循环调用的接口有的处于pedding状态 &#xff0c;有的还在加载中&#xff0c;这就导致勾…

安泰电子:ATA-ML100水声功率放大器模块技术参数

随着人类对海洋的深度探索和利用的不断加深&#xff0c;水下通信技术日益成为研究的热点。水下通信技术是指在海洋、湖泊等水体中实现信息传递和交流的技术手段。它不仅在海洋资源勘探、海洋环境监测等领域具有广泛应用&#xff0c;还在水下考古、水下工程等领域发挥着重要作用…

018 - STM32学习笔记 - SPI读写FLASH(三)- 写入字符串、小数与整数

018 - STM32学习笔记 - SPI访问Flash&#xff08;三&#xff09;- 写入字符串、小数与整数 上节对Flash的跨页写入数据进行了完善&#xff0c;但是数据写入都是以Byte数组的方式进行写入&#xff0c;这节分别进行字符串的写入和小数整数的写入&#xff0c;本节内容对SPI的函数…

linux之Ubuntu系列(四)用户管理 用户和权限 chmod 超级用户root, R、W、X、T、S 软链接和硬链接

r(Read&#xff0c;读取)&#xff1a;对文件而言&#xff0c;具有读取文件内容的权限&#xff1b;对目录来说&#xff0c;具有浏览目 录的权限。 w(Write,写入)&#xff1a;对文件而言&#xff0c;具有新增、修改文件内容的权限&#xff1b;对目录来说&#xff0c;具有删除、移…

Burp Suite---渗透测试工具

文章目录 Burp SuiteBurp Suite入门设置代理HTTP的代理 Proxy&#xff08;代理&#xff09; Burp Suite 是一款集成化的渗透测试工具&#xff0c;包含了很多功能&#xff0c;可以帮助我们高效地完成对Web应用程序的渗透测试和攻击。 Burp Suite由Java语言编写&#xff0c;基于…

十大网络安全上市公司分析,让我们重点聊聊F5

网络安全上市厂商业务广泛分布于网络安全硬件、软件&#xff0c;网络安全服务等板块&#xff0c;总体来看&#xff0c;十大网络安全上市公司的竞争可谓是如火如荼。今天让我们把目光集中在F5&#xff0c;这个能为我们所有人创造更安全的数字世界的企业&#xff0c;在应用及API交…

PuTTY下载(免安装exe)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

手写数字识别Minst(CNN)

文章目录 手写数字识别网络结构加载数据集数据集可视化CNN网络结构训练模型保存模型和加载模型测试模型 手写数字识别 网络结构 网上给出的基本网络结构&#xff1a; 然而在本数据集中&#xff0c;输入图不是1*32*32&#xff0c;是1*28*28。所以正确的网络结构应该是 level…