GridBagLayout does not align images correctly

Initially, I have a deck image and the text โ€œDeckโ€ just below the image, which looks fine

pic1

public class GuiTut extends JPanel { private GridBagConstraints c = new GridBagConstraints(); private JLabel deckLabel = new JLabel(); public GuiTut() { setLayout(new GridBagLayout()); try { deck = ImageIO.read(new File("resources/images/deck.jpg")); } catch (Exception e) {} c.gridx = 0; c.gridy = 0; JLabel deckPic = new JLabel(new ImageIcon(deck)); add(deckPic, c); deckLabel.setText("Deck"); c.gridx = 0; c.gridy = 1; add(deckLabel, c); } 

But after adding my gridLayout panel gridLayout whole GUI was messed up. Since you can see that the image of my deck is not correctly aligned with the first line of my gridLayout and my deck text has been separated by several wide spaces.

pic2

 public class GuiTut extends JPanel { private GridBagConstraints c = new GridBagConstraints(); private JLabel deckLabel = new JLabel(); private JPanel gridLayoutPanel = new JPanel(new GridLayout(2, 0)); private JLabel[] label = new JLabel[14]; public GuiTut() { setLayout(new GridBagLayout()); try { card = ImageIO.read(new File("resources/images/card.jpg")); } catch (Exception e) {} for(int i = 0; i < 14; i++) { label[i] = new JLabel(new ImageIcon(card); gridLayoutPanel.add(label[i]); } try { deck = ImageIO.read(new File("resources/images/deck.jpg")); } catch (Exception e) {} c.gridx = 0; c.gridy = 0; JLabel deckPic = new JLabel(new ImageIcon(deck)); add(deckPic, c); deckLabel.setText("Deck"); c.gridx = 0; c.gridy = 1; add(deckLabel, c); c.gridx = 1; c.gridy = 0; add(gridLayoutPanel, c); } 

I want the deck image to be aligned with the first gridLayout line and the text "deck" right below the deck image, but I canโ€™t get it.

+6
source share
1 answer

Hot links

enter image description hereenter image description here

  • For a deck label, you can simply set the label text and set the vertical / horizontal text lines

     JLabel label = new JLabel(new ImageIcon(new URL(DECK_URL))); label.setText("DECK"); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); 
  • For the problem of deck placement, you can use a different layout manager, such as BorderLayout for the external panel, and the default flow layout for the deck panel. Maps will still be GridLayout. It is usually useful to insert panels when you need to

Example

enter image description here

 import java.awt.BorderLayout; import java.awt.GridLayout; import java.net.URL; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class GuiTest { private static final String DECK_URL = "http://i.stack.imgur.com/xNffR.png"; private static final String CARD_URL = "http://i.stack.imgur.com/uVS1D.png"; private static JPanel createDeckPanel() { JPanel panel = new JPanel(); try { JLabel label = new JLabel(new ImageIcon(new URL(DECK_URL))); label.setText("DECK"); label.setHorizontalTextPosition(JLabel.CENTER); label.setVerticalTextPosition(JLabel.BOTTOM); panel.add(label); } catch (Exception ex) { ex.printStackTrace(); } return panel; } private static JPanel createCenterPanel(int rows, int cols) { JPanel panel = new JPanel(new GridLayout(rows, cols)); for (int i = 0; i < rows*cols; i++) { try { panel.add(new JLabel(new ImageIcon(new URL(CARD_URL)))); } catch (Exception ex) { ex.printStackTrace(); } } return panel; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ public void run() { JPanel panel = new JPanel(new BorderLayout()); panel.add(createDeckPanel(), BorderLayout.LINE_START); panel.add(createCenterPanel(2, 6)); JOptionPane.showMessageDialog(null, panel); } }); } } 
+3
source

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


All Articles