2014-05-06 24 views
0

我想通過FlowLayout向JFrame添加一個JPanel,但繼續得到這個異常:「線程中的異常」AWT-EventQueue-0「java.lang.IllegalArgumentException:非法組件位置」。我希望在不久的將來能夠實現帶有幾個按鈕的JPanel,所以請讓我知道我可以做些什麼來允許這樣做。我正在嘗試使用Flowlayout將Janel添加到JFrame中,但繼續發生異常。我做錯了什麼?

package textadv; 


import java.awt.FlowLayout; 
import java.awt.Button; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Label; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractButton; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TextAdv { 

private JFrame frame = new JFrame("Text Adventure"); 
private JPanel mainPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
private JButton b1 = new JButton("Left"); 

public TextAdv() { 

    mainPanel.setBackground(Color.RED); 

    int FRAME_WIDTH = 400; 
    int FRAME_HEIGHT = 400; 

    b1.setEnabled(true); 
    b1.setVisible(true); 
    b1.setPreferredSize(new Dimension(40, 40)); 

    mainPanel.setVisible(true); 
    mainPanel.setPreferredSize(new Dimension (50, 50)); 

    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    frame.setVisible(true); 

    mainPanel.add(b1, FlowLayout.CENTER); 
    frame.add(mainPanel); 

} 

public static void main(String[] args) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      TextAdv fS = new TextAdv(); 
     } 
    }); 

} 

回答

4

您無法指定Container的add方法的FlowLayout選項。這解決了接受Component的add()重載和一個int索引。其他佈局可讓您使用add(Component,Object)重載,如GridBagLayout及其GridBagConstraints。對於FlowLayout,您只能爲佈局的構造函數指定選項。

替換此

mainPanel.add(b1, FlowLayout.CENTER); 

與此

mainPanel.add(b1); 

考慮重新審視這裏的教程:http://docs.oracle.com/javase/tutorial/uiswing/layout/flow.html

見集裝箱的位置:http://docs.oracle.com/javase/7/docs/api/java/awt/Container.html#add%28java.awt.Component,%20int%29

相關問題