2012-07-16 80 views
1

我是新來的佈局和我現在使用的是一個CardLayout與兩個不同的卡,目前有一個背景圖像和一個按鈕。如下所示,該按鈕位於屏幕的頂部,我想將它放置在靠近底部的某個位置。我的理解是GridBagLayout將是實現這一目標的最佳方式。所以我的第一個問題是,這是真的嗎?另外,如果我想將GridBagLayout放在CardLayout中的卡上,那麼是否可以這樣做。我想在GridBagLayout中添加許多其他對象(如果這是實現它的最好方法,並且如果可能的話),因爲我會進一步深入該項目,因此有關正確方向的任何建議都將不勝感激。Java可以使用GridBagLayout來組織CardLayout中使用的JPanel

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

回答

3

一個GridBagLayout會做你想做的,是的。它是最靈活的(但也是最複雜的)之一,可用的是LayoutManager。無論這是否是「最佳」方法,取決於您希望將哪些其他控件添加到面板中,無論是否希望它們調整大小,調整父級JPanel時要實現的目標以及其他因素。

re:嵌套JPanels與不同的佈局,是的。與在JPanel內部是完全正確的,CardLayoutJPanel的內部與BorderLayout [etc ...]