Problem z odświeżaniem obrazu w jApplet form

0

Witam,
mam następujący problem z aplikacją jApplet form:
Otóż gdy wstawię jakiś przykładowy applet na stronę, to niestety w ogóle nie widać jego GUI, dopiero jeżeli kliknę na na jakiś element np. na button, to zostanie on wyświetlony.
W czym jest problem?

0

Ponieważ nie ma kodu, to będę strzelać. ;)

Najczęściej problem jest w tym, że używasz paint zamiast paintComponent. Źle przedefiniowany paint nie wywołuje paintChildren lub robi to nieprawidłowo. Przedefiniowany paint u początkujących zawiera często super.paint(), który tę metodę wywołuje, ale na początku kodu rysującego, a nie na jego końcu. W ten sposób to co jest dalej malowane w tej metodzie zamazuje to co odmalował super.paint() - zanim zobaczy się to na ekranie. Jest tak ponieważ AWT/Swing eliminuje sprzeczne operacje graficzne, których efekt jest eliminowany przez kolejne wywołania.
Zamień więc paint na paintComponent i nie używaj żadnego wywołania z super.cośtam.

0

Kod jest praktycznie całkowicie wygenerowany przez desinger. Nie utworzyłem nawet metody paint.
Co do paintComponent - co musi dokładnie znajdować w ciele tej metody?

0

Kodu nadal nie ma, więc kontynuujemy zgadywanie. Może tworzysz jakiś JFrame (Frame, Panel, JPanel), wywołujesz setVisible(true), a potem dodajesz komponenty.

0

Nie podałem kodu, ponieważ chyba nie ma takiej potrzeby, skoro został wygenerowany automatycznie przez netbeans. Dodałem jedynie w nim element JTextArea, ale jeżeli kod jest faktycznie potrzebny, to potem będę mógł wkleić.

Tzn. paintComponent wygląda tak samo jak paint?
Dlaczego w takim razie ten kod mi nie działa:

    @Override
    protected void paintComponent(Graphics g)
    {
            jTextArea1.setText("Test");
    }

method does not override or implement a method from a supertype
W czym jest problem?

0

Jest sens żebyś zamieścił kod. Metoda paintComponent() nie jest właściwym miejscem na polecenie

jTextArea1.setText("Test");

Ono powinno być w metodzie init() (po skonstruowaniu obiektu jTextArea1).

0
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package net.me;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;


public class Client extends javax.swing.JApplet {

    /**
     * Initializes the applet Client
     */
    @Override
    public void init() {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        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(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the applet */

    }
    
    
    /**
     * This method is called from within the init() method to initialize the
     * form. WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jTextField2 = new javax.swing.JTextField();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();

        jButton1.setText("Send");

        jTextArea1.setEditable(false);
        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane2.setViewportView(jTextArea1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 337, Short.MAX_VALUE))
            .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
        );
    }// </editor-fold>

    // Variables declaration - do not modify
    private javax.swing.JButton jButton1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField2;
    // End of variables declaration
}

Tak, wiem że może być w metodzie init, ale w moim 'prawdziwym' kodzie nie może być, ponieważ ten tekst zmienia się dynamicznie.

0

Metoda init() jest wywoływana automatycznie przez przeglądarkę. Metoda initComponents() nie, Ty musisz ją wywołać.
//Edit. Ani metoda paint(), ani paintComponent() nie jest potrzebna.

0
bogdans napisał(a):

//Edit. Ani metoda paint(), ani paintComponent() nie jest potrzebna.

To w takim razie jaka jest potrzebna?
Tak, jak mówiłem, ten napis nie będzie statyczny, więc nie mógłby być wyświetlony jedynie raz w init.
Oświecisz mnie? :]

0

Omg, przecież Cię oświeciłem

Ty musisz ją wywołać.

Dopisz na końcu metody init()

initComponents();
0

Sorry, faktycznie chyba uwaliłem za dużo linijek.
Normalnie powinno być tam jeszcze

        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        

Ale nie chodziło mi o to.
Chcę jakiegoś odpowiednika metody paint(), tylko w tym przypadku nie mogę jej użyć, ponieważ przez to przestaję się odświeżać grafika w applecie.
Istnieje coś takiego?

0

Ani paint() ani paintComponent() nie służy do zmiany tekstu w JTextArea. Kiedy chcesz ten tekst zmieniać? Przypuszczalnie po kliknięciu przycisku Send. Jeśli tak, to powinieneś dodać do przycisku słuchacza akcji (addActionListener()), a zmianę tekstu wykonywać w metodzie actionPerformed() słuchacza.

0

Czy ty aby w jakimś poleceniu actionPerformed nie wywołujesz czegoś co długo trwa? Bo jeżeli tak, to nigdy żadnego odświeżenia gui nie uzyskasz. Z takiej metody należy jak najszybciej uciec ewentualnie zlecając to coś czasochłonnego jakiemuś nowemu wątkowi/Swingworkerowi/do innego executora.

1 użytkowników online, w tym zalogowanych: 0, gości: 1