GridBagLayout未正确对齐图像

时间:2014-07-26 06:08:53

标签: java swing

最初我有一张卡片图片和一张文字" Deck"就在看起来很好的图像下方

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);
}

但是在我添加gridLayout面板后,我的整个GUI设计都搞砸了。 正如您所看到的,我的deck图像与gridLayout的第一行没有正确对齐 和我的文字" deck"被一些宽阔的空间隔开了。

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);
}

我想要的是甲板图像与甲板图像正好在gridLayout的第一行和文本"deck"对齐,但我似乎无法得到它。

1 个答案:

答案 0 :(得分:3)

热链接图片

enter image description here enter image description here

  1. 对于卡座标签,您只需设置标签文字并设置垂直/水平文字点数

    JLabel label = new JLabel(new ImageIcon(new URL(DECK_URL)));
    label.setText("DECK");
    label.setHorizontalTextPosition(JLabel.CENTER);
    label.setVerticalTextPosition(JLabel.BOTTOM);
    
  2. 对于卡座定位问题,您可以为外部面板使用不同的布局管理器(如BorderLayout),以及卡座面板的默认流布局。这些卡仍然是GridLayout。当您需要

  3. 时,嵌套面板通常很有帮助

    实施例

    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);
                }
            });
        }
    }