¿Se acerca Java Swing Blank JFrame?

Soy nuevo en swing, y me preguntaba por qué a veces mi aplicación aparece en blanco, y a veces muestra los componentes. Parece ser esporádico. No hay excepciones lanzadas ni nada de eso. Simplemente aparece como un JFrame en blanco. En ocasiones, cuando cierro la aplicación y la vuelvo a ejecutar, muestra los componentes correctamente, pero aparece principalmente en blanco. ¿Estoy haciendo algo mal en el código? Estoy usando el Eclipse IDE, si es que importa. Aquí está el código:

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 allStudents; JFrame mainFrame; public Main(){ allStudents = new ArrayList(); 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  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(); } } 

setVisible(true) tiene que ser el último método llamado en su método Principal. De lo contrario, nada puede representar en el JFrame

por qué a veces mi aplicación aparece en blanco, y a veces muestra los componentes. Parece ser esporádico.

No es esporádico, sucede cuando se pierde una llamada a frame.pack() para decirle al cuadro que empaquete todos sus componentes

Haga lo siguiente y el marco debería mostrarse bien:

 mainFrame.add(componentHolder); mainFrame.pack(); mainFrame.setVisible(true);