30/09/2018, 23:13

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.

Đỗ Trung Quân viết 01:18 ngày 01/10/2018

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();
    }
Đỗ Trung Quân viết 01:23 ngày 01/10/2018

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();
            }
        });
        
    }
Bài liên quan
0