diff --git a/src/main/java/com/luoboduner/moo/info/ui/component/TopMenuBar.java b/src/main/java/com/luoboduner/moo/info/ui/component/TopMenuBar.java
index c20d3af..82abc33 100644
--- a/src/main/java/com/luoboduner/moo/info/ui/component/TopMenuBar.java
+++ b/src/main/java/com/luoboduner/moo/info/ui/component/TopMenuBar.java
@@ -8,6 +8,7 @@
import com.luoboduner.moo.info.ui.dialog.AboutDialog;
import com.luoboduner.moo.info.ui.dialog.SettingDialog;
import com.luoboduner.moo.info.ui.dialog.SystemEnvResultDialog;
+import com.luoboduner.moo.info.ui.dialog.SystemInfoTestDialog;
import com.luoboduner.moo.info.ui.form.MainWindow;
import com.luoboduner.moo.info.util.SystemUtil;
import com.luoboduner.moo.info.util.UpgradeUtil;
@@ -107,6 +108,12 @@ public void init() {
logMenuItem.addActionListener(e -> logActionPerformed());
appMenu.add(logMenuItem);
+ // System Info Test
+ JMenuItem syInfoTestMenuItem = new JMenuItem();
+ syInfoTestMenuItem.setText("System Info Test");
+ syInfoTestMenuItem.addActionListener(e -> sysInfoTestActionPerformed());
+ appMenu.add(syInfoTestMenuItem);
+
// System environment variables
JMenuItem sysEnvMenuItem = new JMenuItem();
sysEnvMenuItem.setText("System environment variables");
@@ -335,6 +342,16 @@ private void aboutActionPerformed() {
}
}
+ private void sysInfoTestActionPerformed() {
+ try {
+ SystemInfoTestDialog dialog = new SystemInfoTestDialog();
+ dialog.pack();
+ dialog.setVisible(true);
+ } catch (Exception e2) {
+ log.error("Show system info test dialog failed", e2);
+ }
+ }
+
private void sysEnvActionPerformed() {
try {
SystemEnvResultDialog dialog = new SystemEnvResultDialog();
diff --git a/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.form b/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.form
new file mode 100644
index 0000000..367eb42
--- /dev/null
+++ b/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.form
@@ -0,0 +1,77 @@
+
+
diff --git a/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.java b/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.java
new file mode 100644
index 0000000..e64229a
--- /dev/null
+++ b/src/main/java/com/luoboduner/moo/info/ui/dialog/SystemInfoTestDialog.java
@@ -0,0 +1,464 @@
+package com.luoboduner.moo.info.ui.dialog;
+
+import cn.hutool.core.thread.ThreadUtil;
+import cn.hutool.log.Log;
+import cn.hutool.log.LogFactory;
+import com.intellij.uiDesigner.core.GridConstraints;
+import com.intellij.uiDesigner.core.GridLayoutManager;
+import com.intellij.uiDesigner.core.Spacer;
+import com.luoboduner.moo.info.App;
+import com.luoboduner.moo.info.util.ComponentUtil;
+import com.luoboduner.moo.info.util.ConsoleUtil;
+import oshi.SystemInfo;
+import oshi.hardware.*;
+import oshi.software.os.*;
+import oshi.util.FormatUtil;
+import oshi.util.Util;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class SystemInfoTestDialog extends JDialog {
+ private static final Log logger = LogFactory.get();
+
+ private JPanel contentPane;
+ private JButton buttonOK;
+ private JButton buttonCancel;
+ private JTextArea textArea1;
+
+ public SystemInfoTestDialog() {
+ super(App.mainFrame, "System Info Test");
+ ComponentUtil.setPreferSizeAndLocateToCenter(this, 0.6, 0.64);
+ setContentPane(contentPane);
+ setModal(true);
+ getRootPane().setDefaultButton(buttonOK);
+
+ buttonOK.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onOK();
+ }
+ });
+
+ buttonCancel.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onCancel();
+ }
+ });
+
+ // call onCancel() when cross is clicked
+ setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
+ addWindowListener(new WindowAdapter() {
+ public void windowClosing(WindowEvent e) {
+ onCancel();
+ }
+ });
+
+ // call onCancel() on ESCAPE
+ contentPane.registerKeyboardAction(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ onCancel();
+ }
+ }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
+ }
+
+ private void onOK() {
+ ThreadUtil.execute(this::sysInfoTest);
+ }
+
+ private void sysInfoTest() {
+ logger.info("Initializing System...");
+ SystemInfo si = new SystemInfo();
+
+ HardwareAbstractionLayer hal = si.getHardware();
+ OperatingSystem os = si.getOperatingSystem();
+
+ printOperatingSystem(os);
+ textArea1.append("\n");
+
+ logger.info("Checking computer system...");
+ printComputerSystem(hal.getComputerSystem());
+ textArea1.append("\n");
+
+ logger.info("Checking Processor...");
+ printProcessor(hal.getProcessor());
+ textArea1.append("\n");
+
+ logger.info("Checking Memory...");
+ printMemory(hal.getMemory());
+ textArea1.append("\n");
+
+ logger.info("Checking CPU...");
+ printCpu(hal.getProcessor());
+ textArea1.append("\n");
+
+ logger.info("Checking Processes...");
+ printProcesses(os, hal.getMemory());
+ textArea1.append("\n");
+
+ logger.info("Checking Services...");
+ printServices(os);
+ textArea1.append("\n");
+
+ logger.info("Checking Sensors...");
+ printSensors(hal.getSensors());
+ textArea1.append("\n");
+
+ logger.info("Checking Power sources...");
+ printPowerSources(hal.getPowerSources());
+ textArea1.append("\n");
+
+ logger.info("Checking Disks...");
+ printDisks(hal.getDiskStores());
+ textArea1.append("\n");
+
+ logger.info("Checking Logical Volume Groups ...");
+ printLVgroups(hal.getLogicalVolumeGroups());
+ textArea1.append("\n");
+
+ logger.info("Checking File System...");
+ printFileSystem(os.getFileSystem());
+ textArea1.append("\n");
+
+ logger.info("Checking Network interfaces...");
+ printNetworkInterfaces(hal.getNetworkIFs());
+ textArea1.append("\n");
+
+ logger.info("Checking Network parameters...");
+ printNetworkParameters(os.getNetworkParams());
+ textArea1.append("\n");
+
+ logger.info("Checking IP statistics...");
+ printInternetProtocolStats(os.getInternetProtocolStats());
+ textArea1.append("\n");
+
+ logger.info("Checking Displays...");
+ printDisplays(hal.getDisplays());
+ textArea1.append("\n");
+
+ logger.info("Checking USB Devices...");
+ printUsbDevices(hal.getUsbDevices(true));
+ textArea1.append("\n");
+
+ logger.info("Checking Sound Cards...");
+ printSoundCards(hal.getSoundCards());
+ textArea1.append("\n");
+
+ logger.info("Checking Graphics Cards...");
+ printGraphicsCards(hal.getGraphicsCards());
+
+ JOptionPane.showMessageDialog(contentPane, "Done!\n", "Finished!", JOptionPane.PLAIN_MESSAGE);
+ }
+
+ private void onCancel() {
+ // add your code here if necessary
+ dispose();
+ }
+
+ // all functions codes bellow are copied from oshi-core, and have some changed
+ private void printOperatingSystem(final OperatingSystem os) {
+
+ ConsoleUtil.consoleOnly(textArea1, String.valueOf(os));
+ ConsoleUtil.consoleOnly(textArea1, "Booted: " + Instant.ofEpochSecond(os.getSystemBootTime()));
+ ConsoleUtil.consoleOnly(textArea1, "Uptime: " + FormatUtil.formatElapsedSecs(os.getSystemUptime()));
+ ConsoleUtil.consoleOnly(textArea1, "Running with" + (os.isElevated() ? "" : "out") + " elevated permissions.");
+ ConsoleUtil.consoleOnly(textArea1, "Sessions:");
+ for (OSSession s : os.getSessions()) {
+ ConsoleUtil.consoleOnly(textArea1, " " + s.toString());
+ }
+ }
+
+ private void printComputerSystem(final ComputerSystem computerSystem) {
+ ConsoleUtil.consoleOnly(textArea1, "System: " + computerSystem.toString());
+ ConsoleUtil.consoleOnly(textArea1, " Firmware: " + computerSystem.getFirmware().toString());
+ ConsoleUtil.consoleOnly(textArea1, " Baseboard: " + computerSystem.getBaseboard().toString());
+ }
+
+ private void printProcessor(CentralProcessor processor) {
+ ConsoleUtil.consoleOnly(textArea1, processor.toString());
+ }
+
+ private void printMemory(GlobalMemory memory) {
+ ConsoleUtil.consoleOnly(textArea1, "Physical Memory: \n " + memory.toString());
+ VirtualMemory vm = memory.getVirtualMemory();
+ ConsoleUtil.consoleOnly(textArea1, "Virtual Memory: \n " + vm.toString());
+ List pmList = memory.getPhysicalMemory();
+ if (!pmList.isEmpty()) {
+ ConsoleUtil.consoleOnly(textArea1, "Physical Memory: ");
+ for (PhysicalMemory pm : pmList) {
+ ConsoleUtil.consoleOnly(textArea1, " " + pm.toString());
+ }
+ }
+ }
+
+ private void printCpu(CentralProcessor processor) {
+ ConsoleUtil.consoleOnly(textArea1, "Context Switches/Interrupts: " + processor.getContextSwitches() + " / " + processor.getInterrupts());
+
+ long[] prevTicks = processor.getSystemCpuLoadTicks();
+ long[][] prevProcTicks = processor.getProcessorCpuLoadTicks();
+ ConsoleUtil.consoleOnly(textArea1, "CPU, IOWait, and IRQ ticks @ 0 sec:" + Arrays.toString(prevTicks));
+ // Wait a second...
+ Util.sleep(1000);
+ long[] ticks = processor.getSystemCpuLoadTicks();
+ ConsoleUtil.consoleOnly(textArea1, "CPU, IOWait, and IRQ ticks @ 1 sec:" + Arrays.toString(ticks));
+ long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
+ long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
+ long sys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
+ long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
+ long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
+ long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
+ long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
+ long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
+ long totalCpu = user + nice + sys + idle + iowait + irq + softirq + steal;
+
+ ConsoleUtil.consoleOnly(textArea1, String.format(
+ "User: %.1f%% Nice: %.1f%% System: %.1f%% Idle: %.1f%% IOwait: %.1f%% IRQ: %.1f%% SoftIRQ: %.1f%% Steal: %.1f%%",
+ 100d * user / totalCpu, 100d * nice / totalCpu, 100d * sys / totalCpu, 100d * idle / totalCpu,
+ 100d * iowait / totalCpu, 100d * irq / totalCpu, 100d * softirq / totalCpu, 100d * steal / totalCpu));
+ ConsoleUtil.consoleOnly(textArea1, String.format("CPU load: %.1f%%", processor.getSystemCpuLoadBetweenTicks(prevTicks) * 100));
+ double[] loadAverage = processor.getSystemLoadAverage(3);
+ ConsoleUtil.consoleOnly(textArea1, "CPU load averages:" + (loadAverage[0] < 0 ? " N/A" : String.format(" %.2f", loadAverage[0]))
+ + (loadAverage[1] < 0 ? " N/A" : String.format(" %.2f", loadAverage[1]))
+ + (loadAverage[2] < 0 ? " N/A" : String.format(" %.2f", loadAverage[2])));
+ // per core CPU
+ StringBuilder procCpu = new StringBuilder("CPU load per processor:");
+ double[] load = processor.getProcessorCpuLoadBetweenTicks(prevProcTicks);
+ for (double avg : load) {
+ procCpu.append(String.format(" %.1f%%", avg * 100));
+ }
+ ConsoleUtil.consoleOnly(textArea1, procCpu.toString());
+ long freq = processor.getProcessorIdentifier().getVendorFreq();
+ if (freq > 0) {
+ ConsoleUtil.consoleOnly(textArea1, "Vendor Frequency: " + FormatUtil.formatHertz(freq));
+ }
+ freq = processor.getMaxFreq();
+ if (freq > 0) {
+ ConsoleUtil.consoleOnly(textArea1, "Max Frequency: " + FormatUtil.formatHertz(freq));
+ }
+ long[] freqs = processor.getCurrentFreq();
+ if (freqs[0] > 0) {
+ StringBuilder sb = new StringBuilder("Current Frequencies: ");
+ for (int i = 0; i < freqs.length; i++) {
+ if (i > 0) {
+ sb.append(", ");
+ }
+ sb.append(FormatUtil.formatHertz(freqs[i]));
+ }
+ ConsoleUtil.consoleOnly(textArea1, sb.toString());
+ }
+ }
+
+ private void printProcesses(OperatingSystem os, GlobalMemory memory) {
+ OSProcess myProc = os.getProcess(os.getProcessId());
+ // current process will never be null. Other code should check for null here
+ ConsoleUtil.consoleOnly(textArea1,
+ "My PID: " + myProc.getProcessID() + " with affinity " + Long.toBinaryString(myProc.getAffinityMask()));
+ ConsoleUtil.consoleOnly(textArea1, "Processes: " + os.getProcessCount() + ", Threads: " + os.getThreadCount());
+ // Sort by highest CPU
+ List procs = os.getProcesses(OperatingSystem.ProcessFiltering.ALL_PROCESSES, OperatingSystem.ProcessSorting.CPU_DESC, 5);
+ ConsoleUtil.consoleOnly(textArea1, " PID %CPU %MEM VSZ RSS Name");
+ for (int i = 0; i < procs.size() && i < 5; i++) {
+ OSProcess p = procs.get(i);
+ ConsoleUtil.consoleOnly(textArea1, String.format(" %5d %5.1f %4.1f %9s %9s %s", p.getProcessID(),
+ 100d * (p.getKernelTime() + p.getUserTime()) / p.getUpTime(),
+ 100d * p.getResidentSetSize() / memory.getTotal(), FormatUtil.formatBytes(p.getVirtualSize()),
+ FormatUtil.formatBytes(p.getResidentSetSize()), p.getName()));
+ }
+ OSProcess p = os.getProcess(os.getProcessId());
+ ConsoleUtil.consoleOnly(textArea1, "Current process arguments: ");
+ for (String s : p.getArguments()) {
+ ConsoleUtil.consoleOnly(textArea1, " " + s);
+ }
+ ConsoleUtil.consoleOnly(textArea1, "Current process environment: ");
+ for (Map.Entry e : p.getEnvironmentVariables().entrySet()) {
+ ConsoleUtil.consoleOnly(textArea1, " " + e.getKey() + "=" + e.getValue());
+ }
+ }
+
+ private void printServices(OperatingSystem os) {
+ ConsoleUtil.consoleOnly(textArea1, "Services: ");
+ ConsoleUtil.consoleOnly(textArea1, " PID State Name");
+ // DO 5 each of running and stopped
+ int i = 0;
+ for (OSService s : os.getServices()) {
+ if (s.getState().equals(OSService.State.RUNNING) && i++ < 5) {
+ ConsoleUtil.consoleOnly(textArea1, String.format(" %5d %7s %s", s.getProcessID(), s.getState(), s.getName()));
+ }
+ }
+ i = 0;
+ for (OSService s : os.getServices()) {
+ if (s.getState().equals(OSService.State.STOPPED) && i++ < 5) {
+ ConsoleUtil.consoleOnly(textArea1, String.format(" %5d %7s %s", s.getProcessID(), s.getState(), s.getName()));
+ }
+ }
+ }
+
+ private void printSensors(Sensors sensors) {
+ ConsoleUtil.consoleOnly(textArea1, "Sensors: " + sensors.toString());
+ }
+
+ private void printPowerSources(List list) {
+ StringBuilder sb = new StringBuilder("Power Sources: ");
+ if (list.isEmpty()) {
+ sb.append("Unknown");
+ }
+ for (PowerSource powerSource : list) {
+ sb.append("\n ").append(powerSource.toString());
+ }
+ ConsoleUtil.consoleOnly(textArea1, sb.toString());
+ }
+
+ private void printDisks(List list) {
+ ConsoleUtil.consoleOnly(textArea1, "Disks:");
+ for (HWDiskStore disk : list) {
+ ConsoleUtil.consoleOnly(textArea1, " " + disk.toString());
+
+ List partitions = disk.getPartitions();
+ for (HWPartition part : partitions) {
+ ConsoleUtil.consoleOnly(textArea1, " |-- " + part.toString());
+ }
+ }
+
+ }
+
+ private void printLVgroups(List list) {
+ if (!list.isEmpty()) {
+ ConsoleUtil.consoleOnly(textArea1, "Logical Volume Groups:");
+ for (LogicalVolumeGroup lvg : list) {
+ ConsoleUtil.consoleOnly(textArea1, " " + lvg.toString());
+ }
+ }
+ }
+
+ private void printFileSystem(FileSystem fileSystem) {
+ ConsoleUtil.consoleOnly(textArea1, "File System:");
+
+ ConsoleUtil.consoleOnly(textArea1, String.format(" File Descriptors: %d/%d", fileSystem.getOpenFileDescriptors(),
+ fileSystem.getMaxFileDescriptors()));
+
+ for (OSFileStore fs : fileSystem.getFileStores()) {
+ long usable = fs.getUsableSpace();
+ long total = fs.getTotalSpace();
+ ConsoleUtil.consoleOnly(textArea1, String.format(
+ " %s (%s) [%s] %s of %s free (%.1f%%), %s of %s files free (%.1f%%) is %s "
+ + (fs.getLogicalVolume() != null && fs.getLogicalVolume().length() > 0 ? "[%s]" : "%s")
+ + " and is mounted at %s",
+ fs.getName(), fs.getDescription().isEmpty() ? "file system" : fs.getDescription(), fs.getType(),
+ FormatUtil.formatBytes(usable), FormatUtil.formatBytes(fs.getTotalSpace()), 100d * usable / total,
+ FormatUtil.formatValue(fs.getFreeInodes(), ""), FormatUtil.formatValue(fs.getTotalInodes(), ""),
+ 100d * fs.getFreeInodes() / fs.getTotalInodes(), fs.getVolume(), fs.getLogicalVolume(),
+ fs.getMount()));
+ }
+ }
+
+ private void printNetworkInterfaces(List list) {
+ StringBuilder sb = new StringBuilder("Network Interfaces:");
+ if (list.isEmpty()) {
+ sb.append(" Unknown");
+ } else {
+ for (NetworkIF net : list) {
+ sb.append("\n ").append(net.toString());
+ }
+ }
+ ConsoleUtil.consoleOnly(textArea1, sb.toString());
+ }
+
+ private void printNetworkParameters(NetworkParams networkParams) {
+ ConsoleUtil.consoleOnly(textArea1, "Network parameters:\n " + networkParams.toString());
+ }
+
+ private void printInternetProtocolStats(InternetProtocolStats ip) {
+ ConsoleUtil.consoleOnly(textArea1, "Internet Protocol statistics:");
+ ConsoleUtil.consoleOnly(textArea1, " TCPv4: " + ip.getTCPv4Stats());
+ ConsoleUtil.consoleOnly(textArea1, " TCPv6: " + ip.getTCPv6Stats());
+ ConsoleUtil.consoleOnly(textArea1, " UDPv4: " + ip.getUDPv4Stats());
+ ConsoleUtil.consoleOnly(textArea1, " UDPv6: " + ip.getUDPv6Stats());
+ }
+
+ private void printDisplays(List list) {
+ ConsoleUtil.consoleOnly(textArea1, "Displays:");
+ int i = 0;
+ for (Display display : list) {
+ ConsoleUtil.consoleOnly(textArea1, " Display " + i + ":");
+ ConsoleUtil.consoleOnly(textArea1, String.valueOf(display));
+ i++;
+ }
+ }
+
+ private void printUsbDevices(List list) {
+ ConsoleUtil.consoleOnly(textArea1, "USB Devices:");
+ for (UsbDevice usbDevice : list) {
+ ConsoleUtil.consoleOnly(textArea1, String.valueOf(usbDevice));
+ }
+ }
+
+ private void printSoundCards(List list) {
+ ConsoleUtil.consoleOnly(textArea1, "Sound Cards:");
+ for (SoundCard card : list) {
+ ConsoleUtil.consoleOnly(textArea1, " " + String.valueOf(card));
+ }
+ }
+
+ private void printGraphicsCards(List list) {
+ ConsoleUtil.consoleOnly(textArea1, "Graphics Cards:");
+ if (list.isEmpty()) {
+ ConsoleUtil.consoleOnly(textArea1, " None detected.");
+ } else {
+ for (GraphicsCard card : list) {
+ ConsoleUtil.consoleOnly(textArea1, " " + String.valueOf(card));
+ }
+ }
+ }
+
+ {
+// GUI initializer generated by IntelliJ IDEA GUI Designer
+// >>> IMPORTANT!! <<<
+// DO NOT EDIT OR ADD ANY CODE HERE!
+ $$$setupUI$$$();
+ }
+
+ /**
+ * Method generated by IntelliJ IDEA GUI Designer
+ * >>> IMPORTANT!! <<<
+ * DO NOT edit this method OR call it in your code!
+ *
+ * @noinspection ALL
+ */
+ private void $$$setupUI$$$() {
+ contentPane = new JPanel();
+ contentPane.setLayout(new GridLayoutManager(2, 1, new Insets(10, 10, 10, 10), -1, -1));
+ final JPanel panel1 = new JPanel();
+ panel1.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1));
+ contentPane.add(panel1, new GridConstraints(1, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, 1, null, null, null, 0, false));
+ final Spacer spacer1 = new Spacer();
+ panel1.add(spacer1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_WANT_GROW, 1, null, null, null, 0, false));
+ final JPanel panel2 = new JPanel();
+ panel2.setLayout(new GridLayoutManager(1, 2, new Insets(0, 0, 0, 0), -1, -1, true, false));
+ panel1.add(panel2, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+ buttonOK = new JButton();
+ buttonOK.setText("Start");
+ panel2.add(buttonOK, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+ buttonCancel = new JButton();
+ buttonCancel.setText("Cancel");
+ panel2.add(buttonCancel, new GridConstraints(0, 1, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_HORIZONTAL, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));
+ final JPanel panel3 = new JPanel();
+ panel3.setLayout(new GridLayoutManager(1, 1, new Insets(0, 0, 0, 0), -1, -1));
+ contentPane.add(panel3, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, null, null, 0, false));
+ final JScrollPane scrollPane1 = new JScrollPane();
+ panel3.add(scrollPane1, new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_WANT_GROW, null, null, null, 0, false));
+ textArea1 = new JTextArea();
+ scrollPane1.setViewportView(textArea1);
+ }
+
+ /**
+ * @noinspection ALL
+ */
+ public JComponent $$$getRootComponent$$$() {
+ return contentPane;
+ }
+
+}
diff --git a/src/main/java/com/luoboduner/moo/info/util/ConsoleUtil.java b/src/main/java/com/luoboduner/moo/info/util/ConsoleUtil.java
new file mode 100644
index 0000000..af7979b
--- /dev/null
+++ b/src/main/java/com/luoboduner/moo/info/util/ConsoleUtil.java
@@ -0,0 +1,36 @@
+package com.luoboduner.moo.info.util;
+
+import cn.hutool.log.Log;
+import cn.hutool.log.LogFactory;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import javax.swing.*;
+import java.util.Date;
+
+/**
+ *
+ * ConsoleUtil to print text into textarea
+ *
+ *
+ * @author RememBerBer
+ * @since 2021/12/15.
+ */
+@Slf4j
+public class ConsoleUtil {
+
+ private static final Log logger = LogFactory.get();
+
+ public static void consoleWithLog(JTextArea textArea, String log) {
+ textArea.append(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS") + " ");
+ textArea.append(log + "\n");
+ textArea.setCaretPosition(textArea.getText().length());
+ logger.warn(log);
+ }
+
+ public static void consoleOnly(JTextArea textArea, String log) {
+ textArea.append(log + "\n");
+ textArea.setCaretPosition(textArea.getText().length());
+ }
+
+}
diff --git a/src/main/resources/version_summary.json b/src/main/resources/version_summary.json
index ec6342b..4b69d19 100644
--- a/src/main/resources/version_summary.json
+++ b/src/main/resources/version_summary.json
@@ -19,7 +19,7 @@
{
"version": "1.1.0",
"title": "a little feature and optimization",
- "log": "● update oshi-core to 5.8.6\n● update flatlaf to 2.0-rc1(Support Windows 11 snap layouts menu, macOS screen menu optimization)\n● processes sort method added same as the oshi's demo\n● add cpu usage chart\n● make System Boot Time and Uptime readable\n"
+ "log": "● update oshi-core to 5.8.6\n● update flatlaf to 2.0-rc1(Support Windows 11 snap layouts menu, macOS screen menu optimization)\n● processes sort method added same as the oshi's demo\n● add cpu usage chart\n● make System Boot Time and Uptime readable\n● add System Info Test function menu same as oshi-core\n"
}
]
}
\ No newline at end of file