I want to be able to dynamically add new 60x80 images that will act as buttons to open new frames. However, for some odd reason my createFrame() method fails to add any type of component into the jpanel. I've been trying to fix the issue for a few hours now and I'm not sure what's wrong. I've tried adding plain panels, labels, buttons... but nothing is working. My main JPanel will use FlowLayout for all the images and my main JFrame uses BorderLayout, that way I can position another specific content JPanel under the main one later on.
Here's my code (includes revalidate() as of my edit, which fixed it):
package testit;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.border.LineBorder;
class TestIt extends JFrame implements ActionListener {
//Main window frame and content panel
private JFrame main_frame;
private JPanel main_panel;
//Screen size variable
private Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
public TestIt() {
//Set up the main frame
main_frame = new JFrame("Test Program");
main_frame.setLayout(new BorderLayout());
main_frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main_frame.setIconImage(
new ImageIcon("src/testit/resources/img/app_icon.gif").getImage());
//Set up the inner content panel
main_panel = new JPanel();
main_panel.setLayout(new FlowLayout());
main_panel.setPreferredSize(
new Dimension((screen.width / 10) * 6,(screen.height / 10) * 6));
//Add the menu bar and the main panel to the main frame
main_frame.add(main_panel, BorderLayout.CENTER);
main_frame.setJMenuBar(createMenuBar());
//Display the main GUI
main_frame.pack();
main_frame.setLocationRelativeTo(null);
main_frame.setVisible(true);
}
//Create an instance of the program
private static void runIt() {
TestIt program = new TestIt();
}
private JMenuBar createMenuBar() {
//Create the top menu bar
JMenuBar top_menu_bar = new JMenuBar();
//Create the menu
JMenu main_menu = new JMenu ("Menu");
main_menu.setMnemonic(KeyEvent.VK_M);
top_menu_bar.add(main_menu);
//Create the menu items and add them to the menu
JMenuItem menu_item;
menu_item = new JMenuItem("Add New");
menu_item.setMnemonic(KeyEvent.VK_N);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_N, ActionEvent.ALT_MASK));
menu_item.setActionCommand("new");
menu_item.addActionListener(this);
main_menu.add(menu_item);
menu_item = new JMenuItem("Save");
menu_item.setMnemonic(KeyEvent.VK_S);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
menu_item.setActionCommand("save");
menu_item.addActionListener(this);
main_menu.add(menu_item);
menu_item = new JMenuItem("Exit");
menu_item.setMnemonic(KeyEvent.VK_X);
menu_item.setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_X, ActionEvent.ALT_MASK));
menu_item.setActionCommand("exit");
menu_item.addActionListener(this);
main_menu.add(menu_item);
//Return the assembled menu bar
return top_menu_bar;
}
public void actionPerformed(ActionEvent e) {
if("new".equals(e.getActionCommand())) {
createFrame();
} else if("save".equals(e.getActionCommand())) {
//save();
} else {
quit();
}
}
private void createFrame() {
/*
ImageIcon image = new ImageIcon("src/testit/resources/img/test.gif");
JLabel label = new JLabel("", image, JLabel.CENTER);
main_panel.add(label);
*/
JButton frame = new JButton("test");
frame.setBorder(new LineBorder(Color.BLACK));
frame.setPreferredSize(new Dimension(60, 80));
frame.setVisible(true);
main_panel.add(frame);
main_frame.revalidate();
}
private void quit() {
System.exit(0);
}
public static void main(String [] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
runIt();
}
});
}
}
Any ideas what the error in my code is?
EDIT: I was able to fix it by using main_frame.revalidate()... is that the most appropriate way? It appears the the same thing is accomplished using validate(), but unfortunately, I don't understand the difference even after reading the javadoc.