JTextArea не обновляется в графическом интерфейсе - PullRequest
1 голос
/ 03 декабря 2011

У меня есть программа на Java, которая читает текстовый файл с именами и сортирует их по группам. Число для каждой группы вводится через JTextArea, нажимается «submit» JButton, затем имена назначаются случайным образом.

Наконец группы помещаются в JTextArea. Все работает до тех пор, пока имена не появятся в JTextArea. Они не появляются. Это должно быть сделано методом actionPerformed().

Единственный способ, которым я могу их отобразить, - это включить литерал String в метод JTextArea's append. Затем я должен нажать «отправить» во второй раз, и имена появляются, но литерал StringGroups\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();
    }
}

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Вы должны позвонить revalidate() вместо repaint().

public void actionPerformed(ActionEvent evt) 
{
    ...

    revalidate();
}

или не добавляйте area к bottom в методе actionPerformed - сделайте это в конструкторе.Тогда не нужно revalidate или repaint

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());
}
1 голос
/ 03 декабря 2011

Заменить repaint (); с revalidate () в вашем действии выполнено. Также вы можете удалить метод paintComponent.

...