2012-07-16 79 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 ...]