gpt4 book ai didi

java - JTextArea 未在 gui 中更新

转载 作者:行者123 更新时间:2023-11-29 06:06:32 28 4
gpt4 key购买 nike

我有一个 Java 程序,它读取名称的文本文件并将它们分类。每组的编号通过 JTextArea 输入,单击“提交”JButton,然后随机分配名称。

最后,这些组被放置在 JTextArea 中。一切正常,直到名称应该出现在 JTextArea 中。他们没有出现。这应该在 actionPerformed() 方法中完成。

让它们显示出来的唯一方法是在 JTextArea 的 append 方法中包含一个 String 文字。然后,我必须第二次单击“提交”,名称确实出现了,但是 String 文字 ("Groups\n") 出现了两次,一次之前,一次之后。

为什么我需要文字,为什么文字没有立即出现。

这是我的代码:

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

public class GUIForGroups extends JFrame implements ActionListener
{
JLabel numOfG = new JLabel("How many per group? ");
JTextField num = new JTextField(3);
JButton sub = new JButton("Make Groups!");
JPanel top = new JPanel();

JLabel botTitle = new JLabel("The Groups are:");
private ArrayList<String> roster;
private ArrayList<String> team;
// ArrayList<JLabel> numbers = new ArrayList<JLabel>();
// ArrayList<JTextField> teams = new ArrayList<JTextField>();
JPanel bottom = new JPanel();
JTextArea area = new JTextArea(400,20);
JScrollPane scrollPane = new JScrollPane(area);
ArrayList<String> groups;
int n;
public GUIForGroups()
{
setSize(800,400);
setTitle("Group Picker!");
Container c = getContentPane();
c.setLayout( new BoxLayout(c, BoxLayout.Y_AXIS ) );
top.add(numOfG);
top.add(num);
top.add(sub);
sub.addActionListener(this);
c.add(top);
c.add(bottom);
try {
roster = getRoster();
}
catch (IOException ioe) {
JOptionPane.showMessageDialog(null,"Error reading in data, exiting");
System.exit(0);
}
setVisible(true);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}

public void actionPerformed(ActionEvent evt)
{
String userIn ;
userIn = num.getText() ;
n = Integer.parseInt( userIn ) ;
team = sortInGroups(n);
String s = setPrint();
// /bottom.add(botTitle);

area.append("Groups\n"+setPrint()); // PROBLEM HERE, NOT WORKING
// System.out.print(s); // was for testing
bottom.add(area);
add(bottom);

repaint();
}

public void paintComponent(Graphics g)
{
area.append("The groups are: \n"+setPrint());
add(bottom);
}

public ArrayList<String> getRoster() throws IOException
{
roster = new ArrayList<String>();
Scanner fr = new Scanner(new File("csroster.txt"));
while (fr.hasNext())
{
String name = fr.next();
roster.add(name);
}
return roster;
}

public ArrayList sortInGroups(int n)
{
int i = 0, j=0;
String next="";
ArrayList<String> groups = new ArrayList<String>();
while (roster.size() > 0 )
{
while (i<n && roster.size()>0)
{
int num = (int)(Math.random()*roster.size());
next += roster.remove(num) + " ";
i++;
}
i=0;
groups.add(next);
next = "";
}
return groups;
}

public String setPrint()
{
int teamNum = 1;
String groups="";
for (String t: team)
{
groups += "Team # "+teamNum+++" is: "+t+"\n";

}
return groups;
}


public static void main (String[] args) throws IOException
{
GUIForGroups gui = new GUIForGroups();
}
}

最佳答案

您必须调用 revalidate() 而不是 repaint()

public void actionPerformed(ActionEvent evt) 
{
...

revalidate();
}

或者不要在 actionPerformed 方法中将 area 添加到 bottom - 在构造函数中执行。然后不需要 revalidaterepaint

public GUIForGroups()
{
...
c.add(bottom);
bottom.add(area); // missing a JScrollPane here
try {
...
}


public void actionPerformed(ActionEvent evt)
{
String userIn ;
userIn = num.getText() ;
n = Integer.parseInt( userIn ) ;
team = sortInGroups(n);
String s = setPrint();

area.append("Groups\n"+setPrint());
}

关于java - JTextArea 未在 gui 中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8369638/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com