GUI not appearing at first

Hi,

My friend keeps having a weird problem with his GUI, when it runs, a window appears but it appears empty until you resize, or maximize the box. Does anybody know what is going on?

Thanks

import java.awt.*;

import java.awt.event.*;

import java.util.*;

import java.text.*;

import java.io.*;

import javax.swing.*;

publicclass RomanNumeralextends JFrame{

private JButton convertButton;

private JLabel arabicLabel, romanLabel;

private JTextField arabicTextField, romanTextField;

public RomanNumeral()

{

GUI();

}

publicvoid GUI()

{

Container contentPane = getContentPane();

contentPane.setLayout(null );

contentPane.setBackground(Color.WHITE);

convertButton =new JButton();

convertButton.setBounds(95, 95, 150, 30);

convertButton.setText("Convert");

convertButton.setVisible(true);

contentPane.add(convertButton);

convertButton.addActionListener(

new ActionListener()// anonymous inner class

{

// event handler called when convertJButton is pressed

publicvoid actionPerformed ( ActionEvent event )

{

convert();

}

});

arabicTextField =new JTextField();

arabicTextField.setBounds(202, 55, 45, 30);

arabicTextField.setEditable(true);

contentPane.add (arabicTextField);

arabicLabel =new JLabel();

arabicLabel.setBounds(95, 55, 100, 25);

arabicLabel.setText("Arabic Numeral");

contentPane.add(arabicLabel);

romanTextField =new JTextField();

romanTextField.setBounds(150, 140, 200, 30);

romanTextField.setEditable(false);

contentPane.add(romanTextField);

romanLabel =new JLabel();

romanLabel.setBounds(45, 140, 100, 25);

romanLabel.setText("Roman Numeral");

contentPane.add(romanLabel);

setTitle("Arabic to Roman Numeral Converter");

setVisible(true );

contentPane.setVisible(true);

setSize( 400, 300 );

}

privatevoid convert()

{

romanTextField.setText("");

int value=0;

int number=0;

int error = 0;

StringBuffer result=new StringBuffer();

try{

value =Integer.parseInt( arabicTextField.getText());

number = value;}

catch(NumberFormatException exception){System.out.print("error");error=1;JOptionPane.

showMessageDialog(null,"Remember, 1-5000, Check Input","Check Input", JOptionPane.ERROR_MESSAGE);};

if(error == 0)

{

if (number <1||number>5000)

{

error = 1; JOptionPane.showMessageDialog(null,"Check Input","Invalid Input",

JOptionPane.ERROR_MESSAGE);

}

int thousand= number/1000;

switch (thousand)

{

case 0: result.append("");

break;

case 1: result.append("M");

break;

case 2: result.append("MM");

break;

case 3: result.append("MMM");

break;

case 4: result.append("IV(line above)");

break;

case 5: result.append("V(line above)");

break;

default:result.append("");

break;

}

System.out.print(result);

System.out.print("\n");

number-= thousand*1000;

int hundred = number/100;

switch (hundred)

{

case 0: result.append("");

break;

case 1: result.append("C");

break;

case 2: result.append("CC");

break;

case 3: result.append("CCC");

break;

case 4: result.append("CD");

break;

case 5: result.append("D");

break;

case 6: result.append("DC");

break;

case 7: result.append("DCC");

break;

case 8: result.append("DCCC");

break;

case 9: result.append("CM");

break;

default: result.append("");

}

System.out.print(result+"\n");

number-= hundred*100;

int ten = number/10;

switch (ten)

{

case 0: result.append("");

break;

case 1: result.append("X");

break;

case 2: result.append("XX");

break;

case 3: result.append("XXX");

break;

case 4: result.append("XL");

break;

case 5: result.append("L");

break;

case 6: result.append("LX");

break;

case 7: result.append("LXX");

break;

case 8: result.append("LXXX");

break;

case 9: result.append("XC");

break;

default: result.append("");

}

System.out.print(result+"\n");

number -= ten*10;

switch (number)

{

case 0: result.append("");

break;

case 1: result.append("I");

break;

case 2: result.append("II");

break;

case 3: result.append("III");

break;

case 4: result.append("IV");

break;

case 5: result.append("V");

break;

case 6: result.append("VI");

break;

case 7: result.append("VII");

break;

case 8: result.append("VIII");

break;

case 9: result.append("IX");

break;

default: result.append("");

break;

}

System.out.print(result+"\n");

}

System.out.print(result+"\n");

if(error == 0)

{

romanTextField.setText(result.toString());

}

}

publicstaticvoid main( String[] args )

{

RomanNumeral application =new RomanNumeral();

application.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

}

[12009 byte] By [eboteea] at [2007-11-27 4:56:28]
# 1
does he need to place "pack();" right above setVisible(true); ?
petes1234a at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 2
nothing personal, but that has to be one of the (ahem...) most unusual routines I've seen for converting arabic numbers to roman numerals.
petes1234a at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 3

Here is another way to do the roman number conversion

class RomanCalc

{

private String[] thousandsStringArray = {"M", "", ""};

private String[] hundredsStringArray = {"C", "D", "M"};

private String[] tensStringArray = {"X", "L", "C"};

private String[] onesStringArray = {"I", "V", "X"};

public String arabic2Roman(int arabicNumber)

{

String romanString = "";

// get number in the 1000's place

int thousandsNumber = arabicNumber / 1000;

// thousand's place

romanString += Numb2RomanStr(thousandsNumber, thousandsStringArray);

// get number in the 100's place

int numberThatsLeft = arabicNumber - thousandsNumber * 1000;

int hundresNumber = numberThatsLeft / 100;

// hundred's place

romanString += Numb2RomanStr(hundresNumber, hundredsStringArray);

// get number in the 10's place

numberThatsLeft -= hundresNumber * 100;

int tensNumber = numberThatsLeft / 10;

// ten's place

romanString += Numb2RomanStr(tensNumber, tensStringArray);

// get number in the 1's place

numberThatsLeft -= tensNumber * 10;

int onesNumber = numberThatsLeft;

// one's place

romanString += Numb2RomanStr(onesNumber, onesStringArray);

return romanString;

}

private static String Numb2RomanStr(int Number, String[] powerOf10Array)

{

String onesChar = powerOf10Array[0];

String fivesChar = powerOf10Array[1];

String tensChar = powerOf10Array[2];

String ResultStr = "";

if ((Number == 9) && (tensChar != "")) // not in thousands

// where there is no "TenChar"

{

ResultStr += onesChar + tensChar;

Number = 0;

}

else if ((Number < 9) && (Number > 4))

{

ResultStr += fivesChar;

Number -= 5;

}

else if (Number == 4)

{

ResultStr += onesChar + fivesChar;

Number = 0;

}

// add final digits to number if any of number left.

for (int i = 0; i < Number; i++)

{

ResultStr += onesChar;

}

return ResultStr;

}

}

petes1234a at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 4

and here's the gui part

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

class MyRoman extends JFrame

{

private JButton convertButton;

private JLabel arabicLabel, romanLabel;

private JTextField arabicTextField, romanTextField;

private JPanel arabPanel, romanPanel;

private JPanel mainPanel;

int bordersz = 20;

int textfieldSize = 12;

public MyRoman()

{

addWidgets();

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

getContentPane().add(mainPanel);

pack();

}

private void addWidgets()

{

GridLayout myGL = new GridLayout(0, 2);

myGL.setHgap(bordersz);

arabicLabel = new JLabel("Arabic Number", SwingConstants.RIGHT);

arabicTextField = new JTextField(textfieldSize);

arabPanel = new JPanel(myGL);

arabPanel.add(arabicLabel);

arabPanel.add(arabicTextField);

romanLabel = new JLabel("Roman Number", SwingConstants.RIGHT);

//romanLabel.setHorizontalTextPosition(SwingConstants.RIGHT);

romanTextField = new JTextField(textfieldSize);

romanPanel = new JPanel(myGL);

romanPanel.add(romanLabel);

romanPanel.add(romanTextField);

convertButton = new JButton("Convert arabic to roman number");

convertButton.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent arg0)

{

doConversion();

}

});

JPanel buttonPanel = new JPanel();

buttonPanel.add(convertButton);

JPanel numberPanel = new JPanel(new BorderLayout());

numberPanel.add(arabPanel, BorderLayout.NORTH);

numberPanel.add(romanPanel, BorderLayout.SOUTH);

mainPanel = new JPanel(new BorderLayout());

mainPanel.add(numberPanel, BorderLayout.NORTH);

mainPanel.add(buttonPanel, BorderLayout.SOUTH);

mainPanel.setBorder(BorderFactory.createEmptyBorder(bordersz , bordersz, bordersz, bordersz));

}

protected void doConversion()

{

try

{

int arabInt = Integer.parseInt(arabicTextField.getText());

if (arabInt < 5000 && arabInt > 0)

{

RomanCalc rc = new RomanCalc();

romanTextField.setText(rc.arabic2Roman(arabInt));

}

else

{

romanTextField.setText("");

arabicTextField.setText("");

JOptionPane.showMessageDialog(null, "Arabic number must be > 0 and < 5000");

}

}

catch (NumberFormatException nfe)

{

romanTextField.setText("");

arabicTextField.setText("");

JOptionPane.showMessageDialog(null, "Arabic number input is not in proper numeric format");

}

}

private static void createAndShowGUI()

{

MyRoman myRmn = new MyRoman();

myRmn.setVisible(true);

}

public static void main(String[] args)

{

javax.swing.SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

createAndShowGUI();

}

});

}

}

petes1234a at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 5
you must put setVisible(true) for that panel or frame.
rameshsa at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 6

> you must put setVisible(true) for that panel or frame.

He does that already as indicated below:

public void GUI()

{

Container contentPane = getContentPane();

contentPane.setLayout( null );

contentPane.setBackground(Color.WHITE);

..........

..........

..........

..........

setTitle("Arabic to Roman Numeral Converter");

setVisible( true );/// *******here ****

contentPane.setVisible(true);

setSize( 400, 300 );

}

petes1234a at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 7
Swing related question should be posted in the Swing forum.You must add your components to the content pane "BEFORE" using frame.setVisible(...).
camickra at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...
# 8
I think this was addressed in update 1. It works on my laptop with JDK6u1. Thanks
eboteea at 2007-7-12 10:11:40 > top of Java-index,Java Essentials,Java Programming...