2016-04-13 86 views
0

我正在嘗試使用流佈局來製作一個菜單屏幕定位與單列,但每當我添加一個按鈕,它將其添加到單個行。桂按鈕佈局的問題

import java.awt.CardLayout; 
import java.awt.Container; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
public class Proj 
{ 
    JPanel card1,card2; 
    ActionListener listener; 
    JFrame menu; 
    JFrame catagories; 
    JButton menu1,addOrTake,cata,payd,showd; 
    //JButton 
    public Proj(){ 


     card2=new JPanel(); 


     menu = new JFrame("Card Layout"); 
     catagories = new JFrame(); 

     //final Container contentPane = menu.getContentPane(); 
     final CardLayout layout = new CardLayout(); 
     menu.setLayout(layout); 
     card1=new JPanel(); 

     menu1 = new JButton(""); 
     menu1.setIcon(new ImageIcon("C:/Users/sabar/Menu.jpg")); 
     menu1.setSize(60,600); 
     menu1.setVisible(true); 

     addOrTake = new JButton(); 
     addOrTake.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample  Pictures/Penguins.jpg")); 

     cata = new JButton(""); 
     cata.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg")); 

     showd = new JButton(""); 
     showd.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg")); 

     payd = new JButton(""); 
     payd.setSize(60, 600); 
     payd.setIcon(new ImageIcon("C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg")); 
     payd.setVisible(true); 

     card1.add(menu1); 
     card1.add(addOrTake); 
     card1.add(cata); 
     card1.add(showd); 
     card1.add(payd); 

     menu1.addActionListener(listener); 
     addOrTake.addActionListener(listener); 
     cata.addActionListener(listener); 
     showd.addActionListener(listener); 
     payd.addActionListener(listener); 

     listener = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) {}}; 
      // TODO Auto-generated method stub 



      menu.setSize(60, 600); 
      menu.setVisible(true); 
      JButton poo=new JButton("Poo"); 
      poo.setSize(60,600); 
      card2.add((poo)); 
      card2.add(new JButton("Pee")); 
      card2.add(new JButton("Per")); 
      card2.add(new JButton("POt")); 
      card2.setVisible(false); 
      menu.add(card2); 

      menu.add(card1); 
      catagories.pack(); 
      menu.pack(); 
      card1.setVisible(false); 


    } 
    public static void main(String[]args) 
    { 
     Proj poop =new Proj(); 
    } 
} 
+1

也許使用'GridBagLayout'代替 – MadProgrammer

回答

2

問題:

  • 你將組件添加到菜單中,CardLayout-使用的容器,而無需使用第二個參數字符串常量。沒有這個,可能很難輕易地交換「卡片」(組件)。
  • 如果你想要一個單一列的佈局類型,你需要使用一個佈局管理器來允許這個,而JPanel的默認佈局不是它。更好的選擇:
    • GridLayout的(0,1),用於可變數目的排,一列
    • BoxLayout的(容器,BoxLayout.PAGE_AXIS)
    • GridBagLayout的與右GridBagConstraint的gridx和gridy屬性。
+0

我對Java來說相當新鮮。是否有可能做cardlayout和gridlayout?我需要在菜單屏幕之間切換。 –

+1

@KenM:當然。只需在其中一個「卡」JPanel中使用GridLayout,然後使用JPanel將其添加到CardLayout。但是,您的問題和代碼告訴我們,您還沒有閱讀過佈局管理器教程,並且您想先做到這一點。 –

+0

@KenM每個佈局將負責一個單獨的容器,所以'CardLayout'將負責'card1'和'card2'組件,並且'GridBagLayout'負責按鈕 – MadProgrammer

1

開始利用佈局管理器,它能夠achiving你的結果。

首先看看Laying Out Components Within a ContainerHow to Use GridLayoutHow to Use GridBagLayout的一些想法。

Layout

import java.awt.CardLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class Proj { 

    JPanel card1, card2; 
    ActionListener listener; 
    JButton menu1, addOrTake, cata, payd, showd; 
    //JButton 

    JFrame menu; 

    public Proj() { 

     menu = new JFrame("Card Layout"); 

     //final Container contentPane = menu.getContentPane(); 
     final CardLayout layout = new CardLayout(); 
     menu.setLayout(layout); 
     card1 = new JPanel(new GridBagLayout()); 
     card2 = new JPanel(new GridBagLayout()); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.REMAINDER; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 

     menu1 = new JButton("Mneu"); 
     menu1.setVisible(true); 

     addOrTake = new JButton("Add or take"); 
     cata = new JButton("Cata"); 
     showd = new JButton("ShowD"); 
     payd = new JButton("payd"); 

     card1.add(menu1, gbc); 
     card1.add(addOrTake, gbc); 
     card1.add(cata, gbc); 
     card1.add(showd, gbc); 
     card1.add(payd, gbc); 

     menu1.addActionListener(listener); 
     addOrTake.addActionListener(listener); 
     cata.addActionListener(listener); 
     showd.addActionListener(listener); 
     payd.addActionListener(listener); 

     listener = new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 
      } 
     }; 
     // TODO Auto-generated method stub 

     JButton poo = new JButton("Poo"); 
     card2.add((poo), gbc); 
     card2.add(new JButton("Pee"), gbc); 
     card2.add(new JButton("Per"), gbc); 
     card2.add(new JButton("POt"), gbc); 

     menu.add(card2, "Card2"); 
     menu.add(card1, "Card1"); 

     layout.show(menu.getContentPane(), "Card1"); 

     menu.pack(); 
     menu.setLocationRelativeTo(null); 
     menu.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       Proj poop = new Proj(); 
      } 
     }); 
    } 
} 

我也不得不在How to Use CardLayout仔細看看關於它如何工作的更多細節,因爲你用錯了

+0

謝謝,這真的很有幫助。我現在正在修復它:) –