Java Swing Blank JFrame即将推出?

我是新手,并且想知道为什么有时我的应用程序会显示为空白,有时会显示组件。 这似乎是零星的。 没有抛出exception或类似的东西。 它经常出现一个空白的JFrame。 有时当我关闭应用程序并再次运行它时,它会正确显示组件,但它主要显示为空白。 我在代码中做错了吗? 我正在使用Eclipse IDE,如果重要的话。 这是代码:

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)必须是Main方法中调用的最后一个方法。 否则,JFrame上不会呈现任何内容

为什么有时我的应用程序显示为空白,有时它会显示组件。 这似乎是零星的。

它不是零星的,当你错过了一个frame.pack()调用告诉框架打包其所有组件时,就会发生这种情况

执行以下操作,框架应显示正常:

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