The complexity of images / panels / buttons from a menu in JPanel

I want to be able to dynamically add new 60x80 images that will act as buttons for opening new frames. However, for some odd reason, my createFrame () method cannot add any component to jpanel. I tried to solve the problem in a few hours, and I'm not sure what happened. I tried to add simple panels, shortcuts, buttons ... but nothing works. My main JPanel will use FlowLayout for all images, and my main JFrame will use BorderLayout, so I can position another specific JPanel content below the main one later.

Here's my code (includes revalidate () on my board that 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 is in my code?

EDIT: I was able to fix this using main_frame.revalidate () ... is this the most suitable way? It seems that the same thing is being done with validate (), but unfortunately I don't understand the difference even after reading the javadoc.

0
source share
2 answers

Perhaps you can clarify, but you stated that the class TestIt extends JFrame so you do not need main_frame = new JFrame("Test Program"); in your constructor.

It could be replaced by the following:

 public testIt() { super("Test Program"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(500, 500); // whatever code goes here such as... // this.add(somePanel); // this.add(new JButton("Click Me!")); // etc.. this.setVisible(true); this.pack(); } 

If there is no clear reason for the frame. Besides, you are not mistaken that you just do it differently, but the reason I called it is why the JFrame subclass if you do not use it?

+1
source

Create dynamic JButton with Image and ActionListener - Java Swing

Dynamically create JButton with Image and ActionListener. You can change the height of the button , the width of the horizontal gap and the vertical gap in one place.

enter image description here

I have a dummy database class that will return main menu items and submenu items. You will see the main menu item in your JFrame. If you select the main item (FOOD) from the button bar, it will load Sub Items from the dummy database class (sub-items of FOOD).

you can find more information with images and source code here

 private void addMainMenue() { pnl_button.removeAll(); repaint(); Image img, sub; ImageIcon icon; String imagePath, imag = "/com/images/"; ArrayList menue = new ArrayList(); ArrayList itemName = new ArrayList(); for (int size = 0; size < ItemDB.mainMenuCodes.length; size++) { menue.add(ItemDB.mainMenuCodes[size]); itemName.add(ItemDB.mainMenuDesc[size]); } JButton[] buttons = new JButton[menue.size()]; for (int i = 0; i < buttons.length; i++) { imagePath = imag + menue.get(i).toString() + ".jpeg"; URL url = getClass().getResource(imagePath); // System.out.println(imagePath +" Get Res : " // +getClass().getResource(imagePath)); if (url != null) { img = Toolkit.getDefaultToolkit().getImage(url); sub = img.getScaledInstance(button_width - 8, button_height - 30, Image.SCALE_FAST); icon = new ImageIcon(sub); } else icon = new ImageIcon(); buttons[i] = new JButton(itemName.get(i).toString(), icon); buttons[i].setVerticalTextPosition(AbstractButton.BOTTOM); buttons[i].setHorizontalTextPosition(AbstractButton.CENTER); buttons[i] .setBorder(javax.swing.BorderFactory.createEtchedBorder()); buttons[i].setFont(new java.awt.Font("Tahoma", 1, 13)); buttons[i].setForeground(new java.awt.Color(0, 51, 255)); buttons[i].setActionCommand(menue.get(i).toString()); buttons[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String choice = e.getActionCommand(); addSubmenue(choice); } }); } int b = 0; int vGap = verticalGap; int hGap = horizontalGap; int bLength = buttons.length; int bRows = bLength / numberOfColumns + 1; L1: for (int j = 0; j < bRows; j++) { vGap = 10; for (int k = 0; k < numberOfColumns; k++) { pnl_button.add(buttons[b], new org.netbeans.lib.awtextra.AbsoluteConstraints(vGap, hGap, button_width, button_height)); repaint(); vGap += button_width + verticalGap; b++; if (b >= bLength) { break L1; } } hGap += button_height + horizontalGap; } pack(); } private void addSubmenue(String choice) { pnl_button.removeAll(); repaint(); Image img, sub; ImageIcon icon; String imagePath, imag = "/com/images/"; ArrayList menue = new ArrayList(); ArrayList itemName = new ArrayList(); ArrayList list = ItemDB.getSubMenu(choice); String subCode[] = (String[]) list.get(0); String subDesc[] = (String[]) list.get(1); for (int size = 0; size < subCode.length; size++) { menue.add(subCode[size]); itemName.add(subDesc[size]); } JButton[] buttons = new JButton[menue.size()]; for (int i = 0; i < buttons.length; i++) { imagePath = imag + menue.get(i).toString() + ".jpeg"; URL url = getClass().getResource(imagePath); // System.out.println(imagePath +" Get Reso : " // +getClass().getResource(imagePath)); if (url != null) { img = Toolkit.getDefaultToolkit().getImage(url); sub = img.getScaledInstance(button_width - 8, button_height - 30, Image.SCALE_FAST); icon = new ImageIcon(sub); } else icon = new ImageIcon(); buttons[i] = new JButton(itemName.get(i).toString(), icon); buttons[i].setVerticalTextPosition(AbstractButton.BOTTOM); buttons[i].setHorizontalTextPosition(AbstractButton.CENTER); buttons[i] .setBorder(javax.swing.BorderFactory.createEtchedBorder()); buttons[i].setFont(new java.awt.Font("Tahoma", 1, 13)); buttons[i].setForeground(new java.awt.Color(0, 51, 255)); buttons[i].setActionCommand(menue.get(i).toString()); buttons[i].addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String choice = e.getActionCommand(); addItems(choice); } }); } int b = 0; int vGap = verticalGap; int hGap = horizontalGap; int bLength = buttons.length; int bRows = bLength / numberOfColumns + 1; L1: for (int j = 0; j < bRows; j++) { vGap = 10; for (int k = 0; k < numberOfColumns; k++) { pnl_button.add(buttons[b], new org.netbeans.lib.awtextra.AbsoluteConstraints(vGap, hGap, button_width, button_height)); repaint(); vGap += button_width + verticalGap; b++; if (b >= bLength) { break L1; } } hGap += button_height + horizontalGap; } pack(); } private void addItems(String choice) { if (choice.equals("P")) choice = "PIZZA"; else if (choice.equals("B")) choice = "BURGER"; else if (choice.equals("FJ")) choice = "FRUIT JUICE"; else if (choice.equals("HB")) choice = "HOT BEVERAGES"; JOptionPane.showMessageDialog(this, "You have select " + choice); } 
0
source

Source: https://habr.com/ru/post/912122/


All Articles