2

私はSwingを初めて使用しますが、なぜアプリケーションが空白で表示されたり、コンポーネントが表示されたりするのではないかと考えていました。散発的なようです。スローされる例外などはありません。空白のJFrameとして頻繁に表示されます。アプリケーションを閉じて再度実行すると、コンポーネントが正しく表示されますが、主に空白で表示されます。コードで何か間違ったことをしていますか?重要な場合は、EclipseIDEを使用しています。コードは次のとおりです。

import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.*;


public class Main extends JFrame implements ActionListener {
    private static final long serialVersionUID = 1L;
    JRadioButton randomRadioButton;
    JRadioButton uniqueRadioButton;
    JRadioButton participationRadioButton;
    ArrayList<Student> allStudents;
    JFrame mainFrame;

    public Main(){
        allStudents = new ArrayList<Student>();
        processAllStudents();
        mainFrame = new JFrame();
        mainFrame.setVisible(true);
        mainFrame.setSize(250, 400);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel componentHolder = new JPanel();
        componentHolder.setLayout(new GridLayout(5,1));

        JLabel titleText = new JLabel("                     Randomizer");
        componentHolder.add(titleText);
        JButton picker = new JButton("Pick a Student");
        JFileChooser filePick = new JFileChooser();
        filePick.addActionListener(this);

        ButtonGroup allRadioButtons = new ButtonGroup();
        randomRadioButton = new JRadioButton("Completely Random");
        uniqueRadioButton = new JRadioButton("Unique");
        participationRadioButton = new JRadioButton("Complete Participation");

        allRadioButtons.add(randomRadioButton);
        allRadioButtons.add(uniqueRadioButton);
        allRadioButtons.add(participationRadioButton);

        componentHolder.add(randomRadioButton);
        componentHolder.add(uniqueRadioButton);
        componentHolder.add(participationRadioButton);

        picker.addActionListener(this);

        componentHolder.add(picker);
        componentHolder.add(filePick);
        mainFrame.add(componentHolder);
    }

    public void actionPerformed(ActionEvent e){
        if(e.getActionCommand().equals("Pick a Student")){
            if(randomRadioButton.isSelected()){
                Student result = getStudentRandom();
                result.increment();
                String resultString = new String(result.getName() + ", " + result.getFrequency());
                System.out.println(resultString);
                JLabel resultLabel = new JLabel(resultString);
                JOptionPane.showMessageDialog(mainFrame, resultLabel);
            }
            else if(uniqueRadioButton.isSelected()){
                Student firstStudent = getStudentRandom();
                Student secondStudent = getStudentRandom();
                Student result;
                if(firstStudent.getName().equals(secondStudent.getName())){
                    result = secondStudent;
                }
                else{
                    result = firstStudent;
                }
                result.increment();
                String resultString = new String(result.getName() + ", " + result.getFrequency());
                System.out.println(resultString);
                JLabel resultLabel = new JLabel(resultString);
                JOptionPane.showMessageDialog(mainFrame, resultLabel);
            }
            else if(participationRadioButton.isSelected()){
                Student result = selectStudentParticipant();
                result.increment();
                JOptionPane.showMessageDialog(mainFrame, result.getName() + ", " + result.getFrequency());
            }

        } else System.out.println("Error.");


    }
    public void processAllStudents(){
        File f = new File("Test.txt");
        Scanner scanFile = null;
        try {
            scanFile = new Scanner(f);
        } catch (FileNotFoundException e) {
            System.out.println("File Not Found");
        }
        while(scanFile.hasNext()){
            String name = scanFile.next();
            int frequency = scanFile.nextInt();
            Student s = new Student(name, frequency);
            allStudents.add(s);
        }
    }
    public Student getStudentRandom(){
        int result = (int) (Math.random() * allStudents.size());
        return allStudents.get(result);
    }
    public Student selectStudentParticipant(){
        Student temp = null;    //Start of bubble sort algorithm

        for(int i = 0; i < allStudents.size() - 1; i++){
            Student firstStudent = allStudents.get(i);
            Student secondStudent = allStudents.get(i+1);
            if(firstStudent.getFrequency() > secondStudent.getFrequency()){
                temp = firstStudent;
                firstStudent = secondStudent;
                secondStudent = temp;
            }
        }

        //End of bubble sort algorithm. Data structure now sorted increasing

        int firstRandom = (int) (Math.random() * (allStudents.size()/2) + 0.2 * allStudents.size());    //Likely to be bigger
        int secondRandom = (int) (Math.random() * (allStudents.size()/2));
        int randomIndex = 0;    //Used to represent a random index

        if(firstRandom > secondRandom){ //More likely. Selects from first half of list
            randomIndex = (int) (Math.random() * allStudents.size()/2);
        }

        else if(firstRandom < secondRandom){    //Possible, but less likely
            randomIndex = (int) ((Math.random() * allStudents.size()/2) + allStudents.size()/2);
        }

        else{   //If the two random numbers are the same
            randomIndex = (int) (Math.random() * allStudents.size()/2);
        }

        return allStudents.get(randomIndex);

    }
    public static void main(String[] args){
        new Main();
    }


}
4

2 に答える 2

6

setVisible(true)Main メソッドで呼び出される最後のメソッドである必要があります。そうしないと、JFrame で何もレンダリングされない可能性があります

于 2012-09-26T18:04:04.587 に答える
5

なぜ私のアプリケーションは空白になることがあり、コンポーネントが表示されることがありますか。散発的なようです。

frame.pack()散発的ではありません。フレームにすべてのコンポーネントをパックするように指示する呼び出しを逃したときに発生します

以下を実行すると、フレームが正常に表示されます。

mainFrame.add(componentHolder);
mainFrame.pack();
mainFrame.setVisible(true);
于 2012-09-26T18:04:28.800 に答える