Toggle Theme Editor
Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Charcoal

Mình Xin Được Hỏi Cách Reload Lại Frame

Discussion in 'Java Project' started by kienxx, 30/3/18.

  1. kienxx

    kienxx Member

    Project mình đang luyện tập là hiển thị 1 Frame, sau khi click vô 1 button thì hiện ra Frame mới cho nhập thông tin. Sau khi xong quay về Frame chính thì nó ko hiển thị theo những gì đã nhập ở Frame con. Nếu tắt đi mở lại chương trình thì mới được. Mình có search các bài trên congdongjava.com và google, biết đến các thứ như WindowListener, validate(), repaint()... nhưng mình vẫn chưa thành công.
    Trong khi tiếp tục tìm kiếm cách giải quyết mình post lên đây hy vọng được mọi người hướng dẫn chi tiết vấn đề này. Thank.
     
  2. JackV

    JackV Administrator Staff Member

    Vì khi tắt frame con bạn new frame chính chứ không phải là setVisible frame chính, đúng không bạn?
    Cái này không hiểu

    @bạn cần đưa code demo vấn đề của bạn.
     
    kienxx and D.A.N_3002 like this.
  3. kienxx

    kienxx Member

    Mình ko biết chính xác nên đưa code nào để JackV hiểu.
    Mình có 3 Frame: khởi tạo là mainFrame(), Info1(int n), và Info2(int n)
    trong mainFrame mình tạo 2 hàm Run1(int n) và Run2(int n) tương tự chạy new Info2(n).
    Code:
    java.awt.EventQueue.invokeLater(new Runnable() {
                  public void run() {
                   new Info1(n)();
                       frame.setVisible(true);
                  }
            });
    Có button "A" ở mainFrame để chạy các hàm Run1(int n). Trong Frame Info1(int n) có button để mở Info2(int n).
    Sau khi nhập liệu ở các Frame Info có button OK để cập nhật thông tin, và Cancel để đóng Frame Info đó.
    Nếu thông tin được nhập ở Frame Info1(int n) thì giao diện ngoài mainFrame hiển thị theo thông tin đó và khi bấm "A" sẽ Run1(int n).
    Nếu nhấn button trong Frame Info1(int n) để mở Frame Info2(int n) và nhập liệu vàp, thì giao diện mainFrame hiển thị theo thông tin nhập trong Info2 và khi bấm "A" sẽ Run2(int n).
    Mình đã viết OK hết rồi nhưng vấn đề là sau khi nhập liệu xong thì giao diện mainFrame ko tự cập nhật. Mà phải tắt đi, chạy lại chương trình thì mainFrame mới cập nhật.
    Còn khi bấm "A" thì các Frame Info được mở lên đều đã tự cập nhật dữ liệu đã nhập - ok.
    Mình nghĩ mỗi khi ấn button OK or cancel trong các Frame Info thì phải viết gì đó để reload lại mainFrame. Nhưng ko biết cách. Ko biết có đúng ko. Mong mọi người giúp.
     
  4. JackV

    JackV Administrator Staff Member

    Khi bạn làm điều đó thì một instance mới của Info1 sẽ được tạo ra chứ không phải cái đã tương tác trước đó.
    Để làm được như bạn muốn thì khi nhấn nút new frame con thì bạn frameCha.setVisible(false) cho frame cha và khi tắt frame con thì bạn gọi biến frameCha.setVisible(true) để frame cha xuất hiện trở lại, để làm được điều đó thì bạn cần phải giữ liên kết đến frame cho khi tạo frame con, tham khảo
    https://congdongjava.com/forum/threads/tham-chiếu-giữa-các-class-reference-between-classes.17221/
    https://congdongjava.com/forum/thre...-gởi-dữ-liệu-qua-cửa-sổ-khác.5963/#post-17044
     
    D.A.N_3002 likes this.
  5. kienxx

    kienxx Member

    Thank JackV đã nhiệt tình support. Mình làm theo bài hướng dẫn như sau:
    Code:
    public static Boutique reload;
        
        public Boutique() {
            reload = this;
            initComponents();
            ToolTipText();
        }
    public void ReLoad() {
            this.setVisible(true);
    } 
    Ở button trong Frame chính để mở Frame con mình thêm this.setVisible(false);
    Ở button set dữ liệu trong Frame con mình thêm Boutique.reload.ReLoad();
    Nhưng kết quả nó vẫn ko tự update giao diện Frame chính. Hướng dẫn mình sai ở đâu được không?
     
  6. D.A.N_3002

    D.A.N_3002 Active Member

    Bạn hiểu sau rồi, void ReLoad() là void bạn dùng để Update lại giao diện !

    Vd : Ở Swing Boutique bạn có 1 JLabel Text và muốn update Text cho nó thì trong ReLoad() sẽ là như thế này :
    PHP:
    public void ReLoad()
    {
            
    Text.setText(text muốn set);
    Còn void ReLoad() của bạn thì chỉ là setVisible thôi chứ không Update lại giao diện !
     
    kienxx likes this.
  7. kienxx

    kienxx Member

    Vậy phải làm sao update giao diện DAN nhỉ?
    Hixx. Mình mới học java.
     
  8. D.A.N_3002

    D.A.N_3002 Active Member

    Bạn có thể xem qua VD này của mình để hiểu hơn :
    Class Main_GUI
    PHP:
    package class_conect;

    public class 
    Main_GUI extends javax.swing.JFrame {

        public static 
    Main_GUI conection;
        public 
    Main_GUI()
        {       
            
    initComponents();
            
    conection this;
        }

        @
    SuppressWarnings("unchecked")
        
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        
    private void initComponents() {

            
    Text = new javax.swing.JLabel();
            
    jButton1 = new javax.swing.JButton();

            
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            
    Text.setFont(new java.awt.Font("Dialog"118)); // NOI18N
            
    Text.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
            
    Text.setText("Text");

            
    jButton1.setText("Set Text");
            
    jButton1.addActionListener(new java.awt.event.ActionListener() {
                public 
    void actionPerformed(java.awt.event.ActionEvent evt) {
                    
    jButton1ActionPerformed(evt);
                }
            });

            
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            
    getContentPane().setLayout(layout);
            
    layout.setHorizontalGroup(
                
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .
    addGroup(layout.createSequentialGroup()
                    .
    addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .
    addGroup(layout.createSequentialGroup()
                            .
    addGap(555555)
                            .
    addComponent(Textjavax.swing.GroupLayout.PREFERRED_SIZE344javax.swing.GroupLayout.PREFERRED_SIZE))
                        .
    addGroup(layout.createSequentialGroup()
                            .
    addGap(159159159)
                            .
    addComponent(jButton1javax.swing.GroupLayout.PREFERRED_SIZE123javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .
    addContainerGap(73Short.MAX_VALUE))
            );
            
    layout.setVerticalGroup(
                
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .
    addGroup(layout.createSequentialGroup()
                    .
    addGap(626262)
                    .
    addComponent(Textjavax.swing.GroupLayout.PREFERRED_SIZE51javax.swing.GroupLayout.PREFERRED_SIZE)
                    .
    addGap(262626)
                    .
    addComponent(jButton1javax.swing.GroupLayout.PREFERRED_SIZE44javax.swing.GroupLayout.PREFERRED_SIZE)
                    .
    addContainerGap(58Short.MAX_VALUE))
            );

            
    pack();
        }
    // </editor-fold>                       

        
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            new 
    Set_Text_GUI().setVisible(true);
        }                                       

        public static 
    void main(String args[]) {
            
            try {
                for (
    javax.swing.UIManager.LookAndFeelInfo info javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if (
    "Nimbus".equals(info.getName())) {
                        
    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (
    ClassNotFoundException ex) {
                
    java.util.logging.Logger.getLogger(Main_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    InstantiationException ex) {
                
    java.util.logging.Logger.getLogger(Main_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    IllegalAccessException ex) {
                
    java.util.logging.Logger.getLogger(Main_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    javax.swing.UnsupportedLookAndFeelException ex) {
                
    java.util.logging.Logger.getLogger(Main_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            }

            
    java.awt.EventQueue.invokeLater(new Runnable()
            {
                public 
    void run() {
                    new 
    Main_GUI().setVisible(true);
                }
            });
        }

        public 
    void Set_Text(String text)
        {
            
    Text.setText(text);
        }
        
    // Variables declaration - do not modify                     
        
    private javax.swing.JLabel Text;
        private 
    javax.swing.JButton jButton1;
        
    // End of variables declaration                   
    }
    Class Set_Text_GUI
    PHP:
    package class_conect;

    public class 
    Set_Text_GUI extends javax.swing.JFrame
    {
        public 
    Set_Text_GUI()
        {
            
    initComponents();
        }

        @
    SuppressWarnings("unchecked")
        
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        
    private void initComponents() {

            
    Text = new javax.swing.JTextField();
            
    jButton1 = new javax.swing.JButton();

            
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

            
    Text.setText("Type Here !");

            
    jButton1.setText("Set");
            
    jButton1.addActionListener(new java.awt.event.ActionListener() {
                public 
    void actionPerformed(java.awt.event.ActionEvent evt) {
                    
    jButton1ActionPerformed(evt);
                }
            });

            
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            
    getContentPane().setLayout(layout);
            
    layout.setHorizontalGroup(
                
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .
    addGroup(javax.swing.GroupLayout.Alignment.TRAILINGlayout.createSequentialGroup()
                    .
    addComponent(Text)
                    .
    addContainerGap())
                .
    addGroup(layout.createSequentialGroup()
                    .
    addGap(154154154)
                    .
    addComponent(jButton1)
                    .
    addContainerGap(190Short.MAX_VALUE))
            );
            
    layout.setVerticalGroup(
                
    layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .
    addGroup(layout.createSequentialGroup()
                    .
    addComponent(Textjavax.swing.GroupLayout.PREFERRED_SIZE39javax.swing.GroupLayout.PREFERRED_SIZE)
                    .
    addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .
    addComponent(jButton1)
                    .
    addGap(012Short.MAX_VALUE))
            );

            
    pack();
        }
    // </editor-fold>                       

        
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
           
    Main_GUI.conection.Set_Text(Text.getText());
        }                                       

        public static 
    void main(String args[]) {
            try {
                for (
    javax.swing.UIManager.LookAndFeelInfo info javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if (
    "Nimbus".equals(info.getName())) {
                        
    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (
    ClassNotFoundException ex) {
                
    java.util.logging.Logger.getLogger(Set_Text_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    InstantiationException ex) {
                
    java.util.logging.Logger.getLogger(Set_Text_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    IllegalAccessException ex) {
                
    java.util.logging.Logger.getLogger(Set_Text_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            } catch (
    javax.swing.UnsupportedLookAndFeelException ex) {
                
    java.util.logging.Logger.getLogger(Set_Text_GUI.class.getName()).log(java.util.logging.Level.SEVEREnullex);
            }
            
            
    java.awt.EventQueue.invokeLater(new Runnable() {
                public 
    void run() {
                    new 
    Set_Text_GUI().setVisible(true);
                }
            });
        }

        
    // Variables declaration - do not modify                     
        
    private javax.swing.JTextField Text;
        private 
    javax.swing.JButton jButton1;
        
    // End of variables declaration                   
    }
    Đây là Demo :
    Capture.PNG
     
  9. D.A.N_3002

    D.A.N_3002 Active Member

    void Set_Text() là void mình dùng để update giao diện, nói chung là bạn muốn nó update cái j thì nhét hết vào 1 void thôi :)
     
    kienxx likes this.
  10. D.A.N_3002

    D.A.N_3002 Active Member

    Còn nếu bạn vẫn không hiểu thì nên đưa code của cả 3 Frame mà bạn nói lên đây, mọi người sẽ sửa :)
     
    kienxx likes this.
  11. kienxx

    kienxx Member

    DAN ơi ko có hàm nào của class tự update lại hết hà?
    Mình phải tự liệt kê update bằng tay sao :(
     
  12. kienxx

    kienxx Member

    Mình đã thử như sau
    ở class Boutique mình thêm
    static public Boutique reload;
    ở contructor mình thêm reload = this;
    Thêm hàm Reload (). Rooms và BookedRooms là các ArrayList chứa new Info(int n) và new DatPhong(int n). Các hàm getName là điều kiện so sánh để Frame chính Boutique hiển thị. Ở các button đóng Frame con mình đều thêm Boutique.reload.ReLoad(); Nhưng kết quả vẫn vậy, ko có thay đổi gì. Mặc dù ý tưởng bài mẫu bạn post mình tự làm ra 1 cái và test thấy cũng đã thành công.
    Code:
    public void ReLoad() {
           for (int i =0; i<13; i++)
            {
             BookedRooms.get(i).getDpName();
             Rooms.get(i).getName();
            }
    Boutique.reload.validate();
    Boutique.reload.repaint();
    Boutique.reload.p101.validate();
    Boutique.reload.p101.repaint();
    Sau đó gọi lại các hàm trong class Boutique
    }  
     
    Last edited: 31/3/18
  13. kienxx

    kienxx Member

    Cảm ơn JackV và DAN đã giúp mình nhé.
    Cứ Frame này gọi hàm frame kia tóe linh tinh :v Nhưng cuối cùng mình làm được rồi. Vui quá !!
     
  14. D.A.N_3002

    D.A.N_3002 Active Member

    Chúc mừng bạn :)
     
    kienxx likes this.
  15. Vũ Thiên

    Vũ Thiên Member

    super(paint);
    có khi thiếu cái này?
     
  16. D.A.N_3002

    D.A.N_3002 Active Member

    Cái đấy không liên quan bạn ạ, bạn @kienxx cần Update thông tin lại cơ mà :)
     
  17. D.A.N_3002

    D.A.N_3002 Active Member

    @kienxx Bạn bị lỗi như thế nào, nếu có thể thì đưa code lên đây để mk dễ sửa hơn :) (Mình nghĩ nên nói ở đây cho đúng Topic)
     
  18. kienxx

    kienxx Member

    Mình đang "đập đi xây lại" :v
    Cho mình hỏi nếu Design Frame = NetBeans, tạo nhiều button, mà lại ko can thiệp đc vào code gốc của nó. Thì làm sao mình gán các button ấy vào 1 ArrayList được nhỉ. Phải liệt kê cực quá.
    Design mình tạo 1 số button như p101, p102...
    Mình thử static ArrayList <javax.swing.JButton> RoomsButton = new ArrayList<javax.swing.JButton>();
    RoomsButton.add(0, p101); nhưng ko được
     
  19. D.A.N_3002

    D.A.N_3002 Active Member

    Bạn có thể can thiệp vào code gốc được nhé, click chuột phải và chọn vào "Customize Code".
    bandicam 2018-03-31 23-36-09-493.jpg
    Sau đó chuyển từ "Default Code" thành " Custom Creation".

    bandicam 2018-03-31 23-36-45-905.jpg
    Chỗ này bạn sai rồi, sủa lại thành :
    PHP:
    RoomsButton.add(p101);
     
    Last edited: 1/4/18
  20. D.A.N_3002

    D.A.N_3002 Active Member

    Còn về vấn đề add nhiều Button vào ArrayList thì mình nghĩ cách này là nhanh nhất và chỉ cần làm 1 lần :
    PHP:
            // Tạo 1 Array chứa các JButton
            
    JButton[] arr =
            {
                
    jButton1,
                
    jButton2,
                
    jButton3,
                
    jButton4,
            };
            
    // Convert Array vừa tạo sang ArrayList<JButton>
            
    ArrayList<JButton> list = new ArrayList<JButton>(Arrays.asList(arr));
     

Chia sẻ trang này

Loading...