2012-10-03 35 views
7

Tôi muốn hiển thị 2 đối tượng trên JFrame. Tôi đã thử bằng cách thêm các đối tượng vào JPanel và sau đó thêm JPanel vào JFrame nhưng nó cũng không hoạt động. Tôi cũng đã cố gắng thêm các đối tượng ball và ball1 trực tiếp vào JFrame nhưng nó chỉ hiển thị đối tượng được thêm cuối cùng. Tôi muốn hiển thị cả hai đối tượng trên JFrame cùng một lúc. Mã dưới đây chỉ hiển thị đối tượng ball1.Thêm 2 hoặc nhiều đối tượng vào 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); 

Trả lời

4

Ngăn nội dung của JFrameBorderLayout trình quản lý bố cục theo mặc định. Điều đó có nghĩa là nếu bạn thêm một thành phần vào nó, nó sẽ được đưa vào CENTER. Nếu bạn thêm một thành phần khác vào nó, nó sẽ lại đặt vào CENTER và nó sẽ thay thế thành phần được thêm trước đó.

Một ví dụ làm thế nào để thêm nhiều thành phần:

JFrame f = new JFrame(); 

JPanel p = new JPanel(); 

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

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

Hoặc khi thêm một thành phần để khung nội dung, xác định nơi để đặt nó (và chỉ định địa điểm khác nhau):

JFrame f = new JFrame(); 

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

Tôi cho tọa độ khác nhau cho các đối tượng mà họ đang có shown.I cũng đã thử các phương pháp thứ hai, nó vẫn ghi đè các đối tượng đầu tiên. – user1717353

+0

Sai, bạn gọi 'f.getContentPane()' hai lần truyền 2 thành phần khác nhau, nhưng không xác định ràng buộc. Và một bảng điều khiển với BorderLayout không có ràng buộc được chỉ định rõ ràng sẽ thêm thành phần vào vị trí CENTER, vị trí thứ hai thay thế cho vị trí đầu tiên. – icza

5

Tôi đề nghị bạn sử dụng một JPanel để giữ cả hai JPanels của bạn là trẻ em, và thêm một JPanel duy nhất vào khung nội dung JFrame.

Cuộc gọi thứ hai tới phương thức JFrame.add() sẽ thay thế JPanel được thêm đầu tiên, nếu bạn không chỉ định rõ vị trí bố cục khác.

Một ví dụ đơn giản sử dụng BoxLayout:

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

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

Mã hoạt động tốt khi tôi thêm nhiều hơn 1 nút trên JFrame nhưng nó không hoạt động với các đối tượng của các lớp của tôi. Tôi cũng đã thử bằng cách sử dụng 3 JPanles và sau đó thêm mainPanel để JFrame nhưng vẫn còn sản lượng tương tự. – user1717353

1

Dưới đây là một ví dụ để đạt UI một cái gì đó như thế này

UI

Các thành phần Java sử dụng được như sau Java Components

Mã :

// 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); 
} 

Lớp 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(); 
    } 
} 
Các vấn đề liên quan