在JavaGUI程序中有没有办法将队列数据保存在内存中
我正在编写一个程序来模拟校园学生的等待队列。这个程序使用一个链表来排队,我使用一个按钮点击事件来执行代码 它只在每次添加时工作一次。我认为它只容纳一名学生,因为该列表在按钮单击事件后被清除。我只想知道有没有办法让列表保持活动状态,直到我终止主程序 我的代码如下:在JavaGUI程序中有没有办法将队列数据保存在内存中,java,user-interface,swt,Java,User Interface,Swt,我正在编写一个程序来模拟校园学生的等待队列。这个程序使用一个链表来排队,我使用一个按钮点击事件来执行代码 它只在每次添加时工作一次。我认为它只容纳一名学生,因为该列表在按钮单击事件后被清除。我只想知道有没有办法让列表保持活动状态,直到我终止主程序 我的代码如下: private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {
private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {
Queue stdQue = new LinkedList(); <-- Create the queue
String stName = addStdName.getText();
int sId;
int stdQuality;
if(!stName.isEmpty()){
// Generate a random number as Id
RanNum tempId = new RanNum();
sId = tempId.genNum();
// Generate a random number as a quality number to be matched later with the apartment
RanNum tempQuality = new RanNum();
stdQuality = tempQuality.genNum();
//StdDetails sTn = new StdDetails(sId, stName, stdQuality);
stdQue.add(sId);
stdQue.add(stdQuality);
stdQue.add(stName);
Object atTop = stdQue.element().toString();
if (!stdQue.isEmpty()){
crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId);
addStdName.setText("");
}else{
crntTop.setText("Queue list is empty.");
}
}else{
crntTop.setText("Please, enter student name.");
}
if(!stdQue.isEmpty()){
for(Object name : stdQue){
lstQue.setText(name.toString());
}
}
}
更改后的主代码如下:
class stdQueCls{
Queue stdQue;
public stdQueCls(){
stdQue = new LinkedList();
}
private void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {
/*AddStdFrm newWindow = null;
newWindow = new AddStdFrm();
newWindow.setVisible(true);
this.setVisible(false);*/
String stName = addStdName.getText();
if(!stName.isEmpty()){
//StdDetails sTn = new StdDetails(sId, stName, stdQuality);
int sId;
int stdQuality;
RanNum tempId = new RanNum();
sId = tempId.genNum();
RanNum tempQuality = new RanNum();
stdQuality = tempQuality.genNum();
stdQue.add(sId);
stdQue.add(stdQuality);
stdQue.add(stName);
Object atTop = stdQue.element().toString();
if (!stdQue.isEmpty()){
crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId);
addStdName.setText("");
}else{
crntTop.setText("Queue list is empty.");
}
}else{
crntTop.setText("Please, enter student name.");
}
if(!stdQue.isEmpty()){
for(Object name : stdQue){
lstQue.setText(name.toString());
}
}
}
}
更新
我更改了代码,将我的链接列表放入一个类中,并将其完全移出按钮单击事件。因此,新代码如下所示
class stdQueCls{
Queue stdQue;
public stdQueCls(){
stdQue = new LinkedList();
if (!stdQue.isEmpty()){
for(Object all : stdQue){
lstQue.setText(all.toString());
}
}
}
}
public void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {
/*AddStdFrm newWindow = null;
newWindow = new AddStdFrm();
newWindow.setVisible(true);
this.setVisible(false);*/
String stName = addStdName.getText();
if(!stName.isEmpty()){
//StdDetails sTn = new StdDetails(sId, stName, stdQuality);
stdQueCls stdQue1 = new stdQueCls();
int sId;
int stdQuality;
RanNum tempId = new RanNum();
sId = tempId.genNum();
RanNum tempQuality = new RanNum();
stdQuality = tempQuality.genNum();
stdQue1.stdQue.add(sId);
stdQue1.stdQue.add(stdQuality);
stdQue1.stdQue.add(stName);
Object atTop = stdQue1.stdQue.element().toString();
if (!stdQue1.stdQue.isEmpty()){
crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId);
addStdName.setText("");
}else{
crntTop.setText("Queue list is empty.");
}
}else{
crntTop.setText("Please, enter student name.");
}
}
现在,正如你们在我的课堂上所看到的,我想在一个名为queLst的文本区域中显示队列中的任何内容,正如你们所看到的,我使用了for循环来做这件事,但我的问题是它没有在文本区域中显示列表,另一件事是,当它被放置在按钮点击事件中时,它起作用,但添加了我在那一点上输入的内容,一些人能告诉我一种方法吗或者给出一个如何存档的想法
更新
我对上面的代码做了一些更改,现在它可以正常工作了,但我不知道我是否做错了一件事是,当我从队列中检索插入的数据时,它不是我期望看到的,我认为我的队列链接列表仍然没有填充
有人能看看我的代码,告诉我我在做什么是写的还是错的吗
class stdQueCls{
Queue<stdDetailGroup> stdQue;
public stdQueCls(){
stdQue = new LinkedList<stdDetailGroup>();
//lstQue.setText(stdQue.toString());
}
}
class stdDetailGroup{
String stdId;
String stQuality;
String stdName;
public stdDetailGroup(String a, String b, String c){
stdId = a;
stQuality = b;
stdName = c;
}
}
public void addStd1ActionPerformed(java.awt.event.ActionEvent evt) {
/*AddStdFrm newWindow = null;
newWindow = new AddStdFrm();
newWindow.setVisible(true);
this.setVisible(false);*/
String stName = addStdName.getText();
if(!stName.isEmpty()){
//StdDetails sTn = new StdDetails(sId, stName, stdQuality);
stdQueCls stdQue1 = new stdQueCls();
int stdQualityInt;
int sIdInt;
String sId;
String stdQuality;
RanNum tempId = new RanNum();
sIdInt = tempId.genNum();
sId = Integer.toString(sIdInt);
RanNum tempQuality = new RanNum();
stdQualityInt = tempQuality.genNum();
stdQuality = Integer.toString(stdQualityInt);
stdDetailGroup stdDetailsAdd = new stdDetailGroup(sId, stdQuality, stName);
stdQue1.stdQue.add(stdDetailsAdd);
Object atTop = stdQue1.stdQue.toString();
if (!stdQue1.stdQue.isEmpty()){
crntTop.setText("Current top of the list: " + atTop + " Student ID: " + sId);
addStdName.setText("");
}else{
crntTop.setText("Queue list is empty.");
}
}else{
crntTop.setText("Please, enter student name.");
}
}
private void shwQue1ActionPerformed(java.awt.event.ActionEvent evt) {
stdQueCls stdQue2 = new stdQueCls();
lstQue.setText(stdQue2.stdQue.toString());
}
类stdQueCls{
队列标准;
公共stdQueCls(){
stdQue=newlinkedlist();
//lstQue.setText(stdQue.toString());
}
}
类stdDetailGroup{
字符串stdId;
字符串质量;
字符串stdName;
公共stdDetailGroup(字符串a、字符串b、字符串c){
stdId=a;
stQuality=b;
stdName=c;
}
}
public void addStd1ActionPerformed(java.awt.event.ActionEvent evt){
/*AddStdFrm newWindow=null;
newWindow=newaddstdfrm();
newWindow.setVisible(true);
此.setVisible(false)*/
字符串stName=addStdName.getText();
如果(!stName.isEmpty()){
//StdDetails sTn=新的StdDetails(sId、stName、stdQuality);
stdQueCls stdQue1=新的stdQueCls();
int标准质量int;
int-sIdInt;
字符串sId;
串标准质量;
RanNum tempId=new RanNum();
sIdInt=tempId.genNum();
sId=整数.toString(sIdInt);
RanNum tempQuality=新RanNum();
stdQualityInt=tempQuality.genNum();
stdQuality=Integer.toString(stdQualityInt);
stdDetailGroup stdDetailsAdd=新的stdDetailGroup(sId、stdQuality、stName);
stdQue1.stdQue.add(stdDetailsAdd);
对象atTop=stdQue1.stdQue.toString();
如果(!stdQue1.stdQue.isEmpty()){
setText(“当前列表顶部:“+atTop+”学生ID:+sId”);
addStdName.setText(“”);
}否则{
setText(“队列列表为空”);
}
}否则{
setText(“请输入学生姓名”);
}
}
私有void shwQue1ActionPerformed(java.awt.event.ActionEvent evt){
stdQueCls stdQue2=新的stdQueCls();
lstQue.setText(stdQue2.stdQue.toString());
}
在按钮的action performed事件中创建linkedlist对象时,每次单击按钮时都会创建并重新初始化该对象。要使数据持久化,请在按钮单击事件之外创建对象
假设类名为StudentManager
,则可以在构造函数内创建对象:
class StudentManager {
Queue stdQue;
public StudentManager() {
stdQue = new LinkedList(); <-- Create the queue
}
private void addStd1ActionPerformed(java.awt.event.ActionEvent evt)
{
.
.
stdQue.add(sId);
stdQue.add(stdQuality);
stdQue.add(stName);
.
.
}
}
班级学生经理{
队列标准;
公共学生经理(){
stdQue=new LinkedList();啊,非常感谢。我还在学习java,有时我的问题可能不符合标准,非常感谢你的回答。我按照你的建议做了,但我得到了“找不到符号:方法addStd1ActionPerformed(evt)”addStd1.setText(“添加学生”);addStd1.addActionListener(new java.awt.event.ActionListener()){public void actionPerformed(java.awt.event.ActionEvent evt){addStd1ActionPerformed(evt);}那就是我得到错误的区域。@Jack你已经将方法addStd1ActionPerformed
放在了stdQueCls
类之外。只需验证一下开始括号和结束括号。是的,我确实从“code”stdQueCls“code”中取出了“code”addStd1ActionPerformed“code”方法,因为当我把它放在那里时,它开始给出一个错误在action listener中,我提到它是对这篇文章的更新。这就是为什么我将它移出并为它创建了一个单独的方法。
class StudentManager {
Queue stdQue;
public StudentManager() {
stdQue = new LinkedList(); <-- Create the queue
}
private void addStd1ActionPerformed(java.awt.event.ActionEvent evt)
{
.
.
stdQue.add(sId);
stdQue.add(stdQuality);
stdQue.add(stName);
.
.
}
}