Reputation: 563
I'm new to swing, and was wondering why sometimes my application comes up as blank, and sometimes it displays the components. It seems to be sporadic. There are no exceptions thrown or anything like that. It just frequently comes up as a blank JFrame. At times when I close the application and run it again, it shows the components correctly, but it mainly comes up as blank. Am I doing something wrong in the code? I'm using the Eclipse IDE, if it matters. Here's the code:
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();
}
}
Upvotes: 2
Views: 5878
Reputation: 10995
setVisible(true)
has to be the last method called in your Main method. Otherwise nothing may render on the JFrame
Upvotes: 7
Reputation: 21409
why sometimes my application comes up as blank, and sometimes it displays the components. It seems to be sporadic.
It is not sporadic, it happens when you miss a frame.pack()
call to tell the frame to pack all its components
Do the following and the frame should display ok:
mainFrame.add(componentHolder);
mainFrame.pack();
mainFrame.setVisible(true);
Upvotes: 5