2012-10-03 38 views
7

我想在JFrame上显示2个对象。我尝试通过向JPanel添加对象,然后将JPanel添加到JFrame,但它也不起作用。我也尝试将ball和ball1对象直接添加到JFrame,但它只显示最后添加的对象。我想一次在JFrame上显示两个对象。以下给出的代码仅显示ball1对象。将2个或更多对象添加到JFrame中

JFrame f = new JFrame("Moving"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //making 2 objects 
    Ballbewegung2 ball = new Ballbewegung2(); 
    Ballbewegung3 ball1 = new Ballbewegung3(); 
    JPanel contentPane = new JPanel(new BorderLayout()); 
    JPanel contentPane1 = new JPanel(new BorderLayout()); 

    //adding objects to JPanel 
    contentPane.add(ball, BorderLayout.CENTER);     
    contentPane1.add(ball1, BorderLayout.CENTER);     

    //Adding JPanel to JFrmae 
    f.getContentPane().add(contentPane); 
    f.getContentPane().add(contentPane1); 
    f.setSize(500, 500); 
    f.setVisible(true); 

回答

4

JFrame内容窗格默认拥有BorderLayout布局管理器。这意味着如果你添加一个组件,它将被放置在CENTER中。如果添加另一个组件,它将再次放入CENTER中,它将替换之前添加的组件。

一个实例如何添加多个组件:

JFrame f = new JFrame(); 

JPanel p = new JPanel(); 

p.add(new JButton("One")); 
p.add(new JButton("Two")); 

f.getContentPane().add(p, BorderLayout.CENTER); 

或添加的成分内容窗格中时指定其中把它(和指定不同的位置):

JFrame f = new JFrame(); 

f.getContentPane().add(new JButton("One"), BorderLayout.NORTH); 
f.getContentPane().add(new JButton("Two"), BorderLayout.CENTER); 
+0

我给不同的坐标,他们是shown.I也曾尝试第二种方法中的对象,但它仍然会覆盖的第一个对象。 – user1717353

+0

错误,你调用'f.getContentPane()'两次传递两个不同的组件,但没有指定约束。并且没有明确指定约束的BorderLayout的面板会将组件添加到CENTER位置,第二个替换第一个组件。 – icza

5

我建议您使用JPanel将两个JPanels作为子项,并将单个JPanel添加到JFrame内容窗格。

如果未明确指定不同的布局位置,则第二次调用JFrame.add()方法将替换第一个添加的JPanel。

使用BoxLayout的一个简单的例子:

JPanel mainPanel= new JPanel(); 
mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); 

mainPanel.add(contentPane); 
mainPanel.add(contentPane1); 
contentPane.add(mainPanel); 
+0

当我在JFrame上添加多于1个按钮时,代码运行良好,但它不适用于我的类的对象。我也尝试使用3个JPanles,然后将mainPanel添加到JFrame中,但输出仍然相同。 – user1717353

1

这里是实现UI像使用该

UI

的Java组件的例子是如下面的 Java Components

代码:

// Call this function from the main 
private static void createAndShowGUI() { 
    // Create and set up the content pane. 
    MainPanel panel = new MainPanel(); 
    panel.setOpaque(true); // content panes must be opaque 

    // Display the window. 
    JFrame frmConsole = new JFrame("ITSME"); 
    frmConsole.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frmConsole.setPreferredSize(new Dimension(640, 480)); 
    frmConsole.add(panel); 
    frmConsole.pack(); 
    frmConsole.setLocationRelativeTo(null); 
    frmConsole.setVisible(true); 
} 

类的mainPanel

public class MainPanel extends JPanel implements ActionListener { 
    private static final long serialVersionUID = 1L; 
    private int m_nX, m_nY; 
    private int m_nHeight = 30, m_nWidthLabel = 500, m_nPadding = 2; 

    private JLabel m_lblFilename, m_lblFileGen; 

    public MainPanel() { 
     // TODO Auto-generated constructor stub 
     super(new BorderLayout()); 
     try { 
      this.setLayout(null); 
      this.setBorder(new TitledBorder(new EtchedBorder(), 
       "Dynamic Time Warping")); 

      m_nX = this.getX() + 12; 
      m_nY = this.getY() + 24; 

      // Add the Filename Label 
      m_lblFilename = new JLabel("Label1"); 
      m_lblFilename.setBorder(new LineBorder(Color.BLUE, 2)); 
      m_lblFilename.setBounds(nX, nY, m_nWidthLabel, m_nHeight); 
      this.add(m_lblFilename); 

      // Adding a Label 
      nY += m_lblFilename.getHeight() + m_nPadding; 
      m_lblFileGen = new JLabel("Label1"); 
      m_lblFileGen.setBorder(new LineBorder(Color.RED, 2)); 
      m_lblFileGen.setBounds(nX, nY, m_nWidthLabel, 3 * m_nHeight); 
      m_lblFileGen.setForeground(Color.BLUE); 
      this.add(m_lblFileGen); 
     } catch (Exception e) { 
     e.printStackTrace(); 
    } 
}