Gặp khó trong Java Swing

Mình có các file Java sau:
JFrameA.java (extends JFrame)
JPanelB.java (extends JPanel) có add button B
JPanelC.java (extends JPanel)

Trên JFrameA đã có add một JPanelA và ở JPanelA có một JButton A. Mình set up button A sao cho khi click vào nó thì:

   this.remove(JPanelA);
   this.add(new JPanelB);

Bây giờ thì mình có JPanelB nằm trong JFrameA. Bây giờ mình muốn nếu mình click và button B thì JFrameA sẽ remove JPanelBadd(JPanelC). Nhưng như mình không biết gọi lại JFrameA như thế nào cả. Đây là giải pháp tạm thời của mình:
Mình set up trong button B như sau:

 JFrameA fr = new JFrameA();
 fr.remove(JPanelA);  // vì JPanelA được add sẵn trong fr 
 fr.add(JPanelB);
 fr.setVisible(true);

Cách này nó củng cho kết quả tương tự nhưng nó xuất hiện thêm một cửa sổ nữa, bên cạnh của sổ JFrameA mình run lúc đầu ( tộng cộng mình run JFrameA 2 lần).
Mình muốn có thể làm việc trên JFrameA ban đầu nhưng nghĩ mãi không ra. Ai có giải pháp cho vấn đề này không ạ.
Em cảm ơn.

Skyfall:

Skyfall:

JFrameA fr = new JFrameA();

Nó hiện cửa sổ mới vì bạn đã tạo 1 Frame nữa trong sự kiện click.

Trường hợp này bạn cũng có thể dùng cardLayout

//Create the "cards".
JPanel cards;

JPanel B= new JPanel();
Button button = new Button();
B.add(button);
...
JPanel C= new JPanel();
...

//Create the panel that contains the "cards".
cards = new JPanel(new CardLayout());
cards.add(B, "Panel B");
cards.add(C, "Panel c");

//call panel when click button
private void buttonPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        cards.show(C,"Panel C");
        cards.repaint();
        cards.validate();
    }

1 Like

Hoặc đơn giản chỉ cần validate lại Frame

 public static void main(String[] args) {
       //tao JFrame
        JFrame f = new JFrame();
        f.setLayout(new BorderLayout());
        f.setSize(600, 500);
        f.setLocation(500, 400);
        f.setVisible(true);
        
       // Tao 2 Jpanel a và b, button a1, b1
        JPanel a = new JPanel(new FlowLayout());
        a.setBackground(Color.red);
        JButton a1 = new JButton("Go Panel B");
        
        JPanel b = new JPanel(new FlowLayout());
        b.setBackground(Color.CYAN);
        JButton b1 = new JButton("Go Panel A");
        b.add(b1);
        a.add(a1);
        
        f.add(a,  BorderLayout.CENTER);
        f.validate();
        
        // action click button a1
         a1.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                f.remove(a);
                f.add(b,  BorderLayout.CENTER);
                f.validate();
                f.repaint();
            }
        });
        //action click  button b1
        b1.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                f.remove(b);
                f.add(a,  BorderLayout.CENTER);
                f.validate();
                f.repaint();
            }
        });
        
    }

1 Like