2013-11-28 105 views
0

這是我的代碼。當我setContentPane(panel)它工作,但是當我getContentPane().add(panel)它不起作用。setContentPane()工作但getContentPane()。add()不起作用

爲什麼第二種方法不起作用? (它不顯示我什麼)

public MyFrame() { 

    final JFrame frame = new JFrame(); 
    frame.setLayout(new BorderLayout()); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    frame.setFont(new Font("Comic Sans MS", Font.BOLD, 12)); 

    JMenuBar mnuBar = new JMenuBar(); 

    JMenu mnu1 = new JMenu("aaa"); 
    mnu1.setMnemonic(KeyEvent.VK_E); 

    JMenuItem menuItem = new JMenuItem("Insert Places", KeyEvent.VK_T); 
    menuItem.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 

      count = 0; 
      jt = new ArrayList[4]; 
      for (int i = 0; i < 4; i++) 
       jt[i] = new ArrayList<JTextField>(); 

      panel = new JPanel(); 
      panel.setLocation(0, 0); 
      panel.setSize(d.width, d.height); 
      panel.setLayout(null); 


      JButton add = new JButton("lllll"); 
      add.setSize(120, 80); 
      add.setLocation(250, 100); 

      add.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 

        for (int i = 0; i < 4; i++) { 
         JTextField jt1 = new JTextField(20); 
         jt1.setSize(150, 30); 
         jt1.setLocation(450 + i * 200, 80 + count * 50); 
         jt1.setVisible(true); 
         jt[i].add(jt1); 
         panel.add(jt1); 
        } 
        count++; 

        frame.repaint(); 

       } 
      }); 
      panel.add(add); 

      JButton confirm = new JButton("ccc"); 
      confirm.setSize(120, 80); 
      confirm.setLocation(250, 200); 

      confirm.addActionListener(new ActionListener() { 

       @Override 
       public void actionPerformed(ActionEvent arg0) { 

        count = 0; 
        for (int j = 0; j < jt[0].size(); j++) { 
         try { 

          connect.insertPlace(Integer.parseInt(jt[0] 
           .get(j).getText()), jt[1].get(j).getText(), 
           Integer.parseInt(jt[2].get(j).getText()), 
           Integer.parseInt(jt[3].get(j).getText())); 
          count++; 
         } catch (Exception e) { 
          JOptionPane.showMessageDialog(null, e, "ERROR", 
           0, null); 
         } 
        } 

        JLabel countL = new JLabel("" + count 
         + " ??? ??? ??  "); 
        countL.setSize(100, 100); 
        countL.setLocation(250, 350 + jt.length * 10); 
        panel.add(countL); 
        frame.repaint(); 

       } 
      }); 
      panel.add(confirm); 
      frame.getContentPane().add(panel); 

     } 
    }); 
    mnu1.add(menuItem); 
    mnuBar.add(mnu1); 
    frame.setJMenuBar(mnuBar); 
    frame.pack(); 
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
    frame.setVisible(true); 
} 

回答

2

Layout現有contentPane而就是這樣,你的面板沒有大小正確,不顯示。比較現有內容頁面的佈局,JFrame和您的JPanel,並注意差異。

+0

我想把我的按鈕任意放在我的面板中。我應該使用什麼佈局? – Paniz

+1

*「我想把我的按鈕任意放在我的面板中」*使用'ArbitraryLayout'。好吧,只是在開玩笑。但是**每個**佈局都有某種形式的邏輯,並且該邏輯應該用1)J2SE佈局管理器中的一個來表示。 2)自定義佈局管理器,或3)佈局管理器的組合。 - 所以哈!我的'ArbitraryLayout'現在聽起來不那麼傻,是嗎? –

+0

的確,您應該決定如何佈置按鈕和麪板,然後使用不同佈局管理器的組合來實現這一點。 – Kayaman

0

the tutorials摘自:

指定組件的位置(例如,BorderLayout.LINE_END)作爲參數向add方法之一。如果此組件在由對象BorderLayout控制的容器中缺失,請確保指定了該組件的位置,並且沒有其他組件位於同一位置。

從我所看到的,你有

frame.setLayout(new BorderLayout()); 

但是,你沒有指定其位置。

frame.getContentPane().add(panel); 

嘗試,而是

frame.getContentPane().add(panel, BorderLayout.CENTER); 

而且,我不知道如果下面的操作順序是相關

panel = new JPanel(); 
panel.setLocation(0, 0); 
panel.setSize(d.width, d.height); 
panel.setLayout(null); 

但是你可以通過設置佈局直接在構造函數上。

panel = new JPanel(null); 

而且,由於您的面板將被插入由佈局管理器控制的容器中,因此您無需指定其位置。至於它的尺寸,你可以指定它的首選尺寸,雖然這不是一些好的做法。

panel.setPreferredSize(new Dimension(d.width, d.height)); 
相關問題