- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前有一个简单的 Java AWT/Swing 代码,它创建一个简单的 GUI,它接受多个字符串用户输入并将其存储并显示在 Intellij 终端中,如下所示:
import javax.swing.*;
import java.awt.*; // Using AWT container and component classes
import java.awt.event.*; // Using AWT event classes and listener interfaces
import java.util.ArrayList;
import java.util.Scanner;
// An AWT program inherits from the top-level container java.awt.Frame
public class DateTime extends JFrame implements ActionListener {
private Label lblCount, lblsource, lbldate1, lbldate2; // Declare a Label component
private JTextField tfCount, date1, date2; // Declare a TextField component
private Button btnCount; // Declare a Button component
private int count = 0; // Counter's value
static String type = null;
private JCheckBox source1, source2;
boolean a = false;
boolean b= false;
static String source, datedefined1, datedefined2;
ArrayList<String> texts = new ArrayList<String>();
// Constructor to setup GUI components and event handlers
public DateTime () {
setLayout(new FlowLayout());
// "super" Frame, which is a Container, sets its layout to FlowLayout to arrange
// the components from left-to-right, and flow to next row from top-to-bottom.
lblCount = new Label("Enter the type of report you want generated; Hourly/ Daily/ Weekly/ EventComparison:"); // construct the Label component
add(lblCount); // "super" Frame container adds Label component
tfCount = new JTextField("", 20); // construct the TextField component
tfCount.setEditable(true); // set to read-only
// "super" Frame container adds TextField component
tfCount.setBounds(10,50,200,40);
add(tfCount);
tfCount.addActionListener(this);
lblsource = new Label("Now choose the source type:");
add(lblsource);
source1 = new JCheckBox("Drivetest", a);
source1.setBounds(10,100,50,30);
add(source1);
source2 = new JCheckBox("Ookla Dump",b);
add(source2);
source1.addActionListener(this);
source2.addActionListener(this);
lbldate1 = new Label("Please enter the Start DATETIME of the chosen duration(YYYY-MM-DD HH:MM:SS) :");
add(lbldate1);
date1 = new JTextField("", 30); // construct the TextField component
date1.setEditable(true);
add(date1);
date1.addActionListener(this);
lbldate2 = new Label("Please enter the end DATETIME of the chosen duration(YYYY-MM-DD HH:MM:SS): ");
add(lbldate2);
date2 = new JTextField("",30);
date2.setEditable(true);
add(date2);
date2.addActionListener(this);
// set to read-only
// "super" Frame container adds TextField component
// "btnCount" is the source object that fires an ActionEvent when clicked.
// The source add "this" instance as an ActionEvent listener, which provides
// an ActionEvent handler called actionPerformed().
// Clicking "btnCount" invokes actionPerformed().
setTitle("Report Generator"); // "super" Frame sets its title
setSize(800, 700); // "super" Frame sets its initial window size
// For inspecting the Container/Components objects
// System.out.println(this);
// System.out.println(lblCount);
// System.out.println(tfCount);
// System.out.println(btnCount);
setVisible(true); // "super" Frame shows
// System.out.println(this);
// System.out.println(lblCount);
// System.out.println(tfCount);
// System.out.println(btnCount);
}
// The entry main() method
public static void main(String[] args) {
// Invoke the constructor to setup the GUI, by allocating an instance
DateTime app = new DateTime();
// or simply "new AWTCounter();" for an anonymous instance
}
// ActionEvent handler - Called back upon button-click.
@Override
public void actionPerformed(ActionEvent evt) {
Object actionsource = evt.getSource();
if(actionsource instanceof JTextField){
JTextField dateget1 = (JTextField) evt.getSource();
JTextField dateget2 = (JTextField) evt.getSource();
if (dateget1 == date1){
datedefined1 = date1.getText();
System.out.println(datedefined1);}
else if(dateget2 == date2){
datedefined2 = date2.getText();
System.out.println(datedefined2);}
else{
type = tfCount.getText();
System.out.println(type);
}
}
else if(actionsource instanceof JCheckBox){
JCheckBox cb = (JCheckBox) evt.getSource();
if(cb == source1){
source = "Drivetest";
System.out.println(source);
}
else if(cb == source2){
source = "Ookla Data Dump";
System.out.println(source);
}
}
}
}
问题是,我的主程序在执行之前需要接受并存储多个字符串变量(即类型、源、date1 和 date2)。
我的程序正常终端样式运行的代码如下所示:
System.out.println("Enter the report type you would like: DailyComparison or HourlyComparison or WeeklyComparison or EventComparison; Type the exact words!");
type = scan.next();
System.out.println("Now enter the type of data you would like analysed: OOKLA or ManualTest: ");
source = scan.next();
if("DailyComparison".equals(type) || "HourlyComparison".equals(type) || "WeeklyComparison".equals(type) ){
Scanner scan2 = new Scanner((System.in));
System.out.println("Now enter the lower bound of the DateTime range(FORMAT YYYY-MM-DD HH:00:00):");
date1 = scan2.nextLine();
System.out.println("Now enter the upper bound of the DateTime range(FORMAT YYYY-MM-DD HH:00:00):");
date2 = scan2.nextLine();
}
正常情况下通过终端进行用户输入。
然后使用用户输入来运行程序的其余部分,调用我定义的其他类中的方法:
Report.report(date1, date2, type, filename, source);// Creates the excel .xlsx file report
MailSender.MailSender(filename, type); // Send a email containing the attached report xlsx file
所以我的问题是:如何扩展此 GUI 代码的功能,以便可以首先收集用户输入的字符串变量,然后用于运行程序的其余部分?
编辑:
谢谢各位的建议。
我有点让它工作,但我不确定结构是否合理。之前发生的情况是,由于每个组件都处理不同的变量,因此我想在调用处理这些变量的主方法类之前先存储所有变量。
所以我创建了一个名为“生成报告”的附加按钮,并在该按钮的 Action 监听器条件+ Action 下,我像这样放置了 class.methods 。基本上我在各个组件(复选框、按钮等)中输入所有变量,然后按“生成报告”
if (evt.getActionCommand() == "Generate Report") {
if ("DailyComparison".equals(type)) {
filename = "\\Users\\User\\Documents\\Reports\\" + " Daily SpeedTest Telco Comparison Report";
datedefined3 = null;
datedefined4 = null;
datedefined5 = null;
datedefined6 = null;
} else if ("WeeklyComparison".equals(type)) {
filename = "\\Users\\User\\Documents\\Reports\\" + " Weekly Telco Comparison Report";
datedefined3 = null;
datedefined4 = null;
datedefined5 = null;
datedefined6 = null;
} else if ("HourlyComparison".equals(type)) {
filename = "\\Users\\User\\Documents\\Reports\\" + "Hourly Telco Comparison Report";
datedefined3 = null;
datedefined4 = null;
datedefined5 = null;
datedefined6 = null;
}
if("HourlyComparison".equals(type)|"DailyComparison".equals(type)|"WeeklyComparison".equals(type)) {
Report.report(datedefined1, datedefined2, datedefined3, datedefined4, datedefined5, datedefined6, type, filename, source);// Creates the base excel .xlsx file report
LinechartGenerator.chartgen(0, "upload", datedefined1, datedefined2, datedefined3, datedefined4, datedefined5, datedefined6, source, type, filename);
LinechartGenerator.chartgen(0, "download", datedefined1, datedefined2, datedefined3, datedefined4, datedefined5, datedefined6, source, type, filename);
LinechartGenerator.chartgen(0, "latency", datedefined1, datedefined2, datedefined3, datedefined4, datedefined5, datedefined6, source, type, filename);
}
}
尽管代码有其局限性,我不能先按“生成报告”,否则程序只会抛出错误,因为没有存储变量。
我还遇到了一个障碍,我试图找到 Flush Scanner 功能的 Swing 等效项,以允许用户在同一程序实例中生成多个报告。
最佳答案
这将引用一些基本原则:
观察者模式在大多数 UI 框架中广泛使用,这些框架往往是事件驱动的(发生了一些事情,你对其做出响应),而不是过程或线性驱动。
通常,您将创建一个“表单”,其中包含捕获所需数据的字段和某种“按钮”,按下该“按钮”将启动下一步 - 验证数据、构建模型并生成表单已完成的通知。
观察者随后将获取模型并根据需要对其进行处理。
这些只是 UI 开发中使用的一些基本概念。看看:
了解更多详情
关于java - 如何在 Java Swing Gui 中存储用户输入的变量以供进一步使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47322487/
大家好我有一个应用程序可以打开一个包含文本和图像组合的文章的 WebView 。如您所知,文章有不同的字体,我想知道是否有办法让 Web View 呈现几种 Helvetica 字体,就像在安装了这些
我正在寻找一种好的格式来归档旧 Linux 计算机的整个文件系统。 西藏自治区 tar.gz 格式非常适合归档具有 UNIX 样式属性的文件,但由于压缩应用于整个归档,因此设计排除了随机访问。相反,如
我最近一直在苦苦挣扎,因为我不得不更改我不久前编写的一些代码以在 Qt 中进行图像处理和 OpenGl以支持多线程。 问题是我想用它在一组图像上应用批量过滤器, 我正在使用 openMP 来做这样的多
我已成功将两个实际设备连接到 Azure IoTHub(在同一个 IoT 中心),并希望第二个设备接收第一个设备发送的消息。因此,在普通的 MQTT 代理中,第二个设备仅订阅该主题,但 Azure没有
我需要一些 Jenkins 作业才能通过 ssh 通过 shell 命令行访问其他一些机器。 我该怎么做? 我没有目标服务器的密码,但我有一个“ key ”文件,但是当我使用以下命令运行作业时 ssh
我在 Mac OSX Mavericks 上使用 MAMP。我想安装最新的 XDebug v2.2.4。根据 XDebug 向导,我下载了 XDebug 2.2.4 源代码。我的系统上安装了许多版本的
所以我正在制作一个程序,从用户给定的 AZ Lyrics 歌曲中提取歌词。我遇到的问题是,在将字符串转换为 URL 后,它说 Jsoup 无法解析它,因为它不接受字符串,尽管变量是我们传入的 URL。
我已经安装了 AWS .NET SDK通过 MSI 安装程序。我想使用这段代码: static IAmazonS3 client; client = new AmazonS3Client(Amazon
我正在使用 cURL 检索另一个页面,除非我有特定的 cookie,否则我看不到页面内容。 cookie 名称是 seepage,它的值必须设置为 1 才能让我看到页面内容。 我想使用 cURL 加载
目录 1、VLC代码封装 1.1 QT(C++)工程 1.2static 声明 m_instance 优化效率 1.3封装 DLL
我是 Docker 新手,但有一个 Java Web 应用程序项目,我的 Maven 构建会为其生成并安装 Docker 镜像。即 mvn clean install 产品: REPOSITORY
我正在尝试在 Debian Stretch 上做一个带有 uinput 的虚拟键盘,我可以输入字符串,比如“Toto!”,键盘会写入这个字符串。但是,我一直坚持从 C char 到键盘处理的键码的转换
我们正在 Rails 中开发一个 JSON REST API,供我们也在开发的 Android 应用程序使用。有什么方法可以保护 API,使其只能由我们特定的 Android 应用程序使用? API
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
所以我有一个问题,我有 2 个应用程序部署在具有不同端口的同一网站上,一个是登录应用程序,一个是HRIS 系统。 我的问题是,当我的登录应用程序创建 token 时并重定向到我的 hris 系统,hr
在给出的第三段代码的上下文中交谈 on this page , 有一个方法 Messenger named getBinder()返回 the IBinder Messenger 用于与 associ
我目前有一个私有(private) Java 项目,我正在尝试将其完善以供其他开发人员使用。我想做的一件事是让 Ant 自己下载 JUnit、PMD 和 FindBugs 等所需的 JAR,这样开发人
我想在 Qt 中使用 ffmpeg 库进行编程。 如何在 Windows 上将 ffmpeg 编译成 *.lib 文件? 或 如何使用Qt官方发布的编译后的*.dll文件? 还有,哪种方式比较好? 最
我正在为扩展 std::vector 实例化的 C++ 类开发 Python 绑定(bind)。为了让 Python 下标运算符为此类工作,我添加了如下所示的 __getitem__ 函数(我删除了不
我正在为 Amazon SWF 的相当简单的工作流程编写 PHP。我发现自己开始编写一个库来检查某些操作是否已经开始或完成。基本上遍历事件列表以检查事情的进展情况,然后在需要时启动适当的事件。有时这可
我是一名优秀的程序员,十分优秀!