簡體   English   中英

Java可以使用GridBagLayout來組織CardLayout中使用的JPanel

[英]Java can a GridBagLayout be used to organize a JPanel used in a CardLayout

我是布局的新手,現在我正在使用的是帶有兩張不同卡的CardLayout,這些卡目前有一個背景圖像和一個按鈕。 如下圖所示,按鈕位於屏幕頂部,我想將它放在靠近底部的位置。 我的理解是GridBagLayout將是實現這一目標的最佳方式。 所以我的第一個問題是,這是真的嗎? 而且,如果我想要放置GridBagLayout的JPanel是CardLayout中的卡,是否可以這樣做。 我想把很多其他對象放到GridBagLayout中(如果這是最好的方法,如果可能的話),當我進一步進入項目時,所以任何關於正確方向去哪里的建議將非常感激。

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;

public class Cards implements ActionListener {    
private JPanel cards;
private JButton button1;
private JButton button2;
private Image backgroundImage;

public void addComponentToPane(Container pane) throws IOException {
    try {           
        backgroundImage = ImageIO.read(getClass().getResource("resources/background.jpg"));         
    } catch (IOException ex) {
        ex.printStackTrace(System.err);
    }

    //create cards
    JPanel card1 = new JPanel()
    {
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(backgroundImage, 0, 0, null);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(
                    backgroundImage.getWidth(null),
                    backgroundImage.getHeight(null));
        }
    };
    JPanel card2 = new JPanel()
    {
        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            g.drawImage(backgroundImage, 0, 0, null);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(
                    backgroundImage.getWidth(null),
                    backgroundImage.getHeight(null));
        }
    };
    //create buttons
    button1 = new JButton("Button 1");
    button2 = new JButton("Button 2");
    button1.addActionListener(this);
    button2.addActionListener(this);
    //add buttons to cards
    card1.add(button1);        
    card2.add(button2);
    //create panel that contains cards
    cards = new JPanel(new CardLayout());
    cards.add(card1, "Card 1");
    cards.add(card2, "Card 2");
    pane.add(cards, BorderLayout.SOUTH);        
}

public void itemStateChanged(ItemEvent evt) {
    CardLayout cl = (CardLayout)(cards.getLayout());
    cl.show(cards, (String)evt.getItem());
}

public static void createAndShowGUI() throws IOException  {
    //create and setup window
    JFrame frame = new JFrame("Frame"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    //create and setup content pane
    Cards main = new Cards();
    main.addComponentToPane(frame.getContentPane());        
    //display window
    frame.pack();       
    //frame.setResizable(false);
    frame.setVisible(true);
}

public void actionPerformed(ActionEvent ae) {
    if (ae.getSource() == button1) {
        CardLayout cl = (CardLayout) (cards.getLayout());
        cl.show(cards, "Card 2");     
    } else if (ae.getSource() == button2) {
        CardLayout cl = (CardLayout) (cards.getLayout());
        cl.show(cards, "Card 1");
    }        
}            

public static void main(String[] args) {
    //set look and feel
    try {
        UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    } catch (UnsupportedLookAndFeelException ex) {
        ex.printStackTrace();
    } catch (IllegalAccessException ex) {
        ex.printStackTrace();
    } catch (InstantiationException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }                

    //schedule job for the event dispatch thread creating and showing GUI        
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {                   
                    try {
                        createAndShowGUI();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                
        }
    });     
}   
}

一個GridBagLayout會做你想要的,是的。 它是最靈活(但也是最復雜的) LayoutManager之一。 它是否是“最佳”方式取決於您想要添加到面板的其他控件,是否希望它們調整大小,調整父JPanel的大小以及其他因素。

re:用不同的布局嵌套JPanels,是的。 在帶有BorderLayout [etc ...]的JPanel內部的帶有CardLayout的JPanel中有一個帶有GridBagLayoutJPanel是完全沒問題的。

看看BorderLayout 它有5個不同的區域,您可以放置​​其他容器:左,右,頂部,中心和底部。

http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM