Avatar billede kagehuset Nybegynder
19. januar 2004 - 01:22 Der er 13 kommentarer og
2 løsninger

repaint problem

Hey

Nu har jeg endnu engang stiret mig blind på et eller andet...
Jeg har denne løkke som bliver udført når der trykkes på en knap i en menu:

else if (menuClicked.equals("Show")) {
  if (show_sidePane = true) {
    show_sidePane = false;
    frame.repaint();
  }
  else {
    show_sidePane = true;
    frame.repaint();
  }

Jeg får denne fejl: non-static method repaint() cannot be referenced from a static context...

mvh
Mads
Avatar billede kagehuset Nybegynder
19. januar 2004 - 01:23 #1
har forresten kigget mig rundt her, men kan ikke få noget af det til at virke...

mvh
Mads
Avatar billede trp79 Nybegynder
19. januar 2004 - 07:46 #2
Hvis jeg ikke tager helt fejl, så tyder det på, at du ikke har oprettet et objekt af den klassse som du kalder metoden i.

Altså du må ikke bare kalde repain fra "public static void main" - du skal først oprettet et objekt af klassen og kalde repaint gennem objektet.

Prøv evt. at poste koden ellers.

Mvh
Torben
Avatar billede kagehuset Nybegynder
19. januar 2004 - 12:56 #3
Hey... Der er lige lidt mange linier kode til at poste - det er en JFrame med 3 JPanels, hvor den ene af de 3 JPanels skal enten vises eller fjernes når der trykkes på menpunktet show... Den JFrame der indeholder de og som skal opdateres 3 JPanels hedder frame... Hvordan laver jeg et objekt af klassen? mvh Mads
Avatar billede trp79 Nybegynder
19. januar 2004 - 13:03 #4
Hvis vi nu siger at den "du gerne vil kalde repaint på" hedder Gui
Så opretter du et objekt af klassen ved at sige "Gui guiObjekt = new Gui();"
Derefter kan du så kalde repain metoden uden problem ("guiObjekt.repaint();").

Håber det hjælper, mvh
Torben
Avatar billede trp79 Nybegynder
19. januar 2004 - 13:05 #5
Hov kan først nu se at du har postet lidt kode i dit spørgsmål...
Svare frame ved dig til guiObjekt i det jeg lige postede?
Avatar billede kagehuset Nybegynder
19. januar 2004 - 13:26 #6
Hejsa Ahh - nu har jeg endelig fattet det :-). Og ja - frame = guiObjekt... Nu er min frame oprettet som objekt i main-metoden, men repaint funktionen kaldes i en anden metode... Skal jeg så også oprette et objekt der? mvh Mads
Avatar billede kagehuset Nybegynder
19. januar 2004 - 13:28 #7
Eller altså ikke nu, frameklassen har hele tiden været oprettet som objekt i mainmetoden... mvh Mads
Avatar billede trp79 Nybegynder
19. januar 2004 - 14:02 #8
Det er fordi du kalder en ikke static metode fra en static metode (main).
Men hvis du vil repainte, så kan du jo i frame klassen kalde repaint ved "this.repaint" - jeg er ikke helt med på hvorfor du vil repainte fra en main metode i en anden klasse?
Avatar billede kagehuset Nybegynder
19. januar 2004 - 14:23 #9
Hey... Det eneste mainmetoden gør er at oprette et objekt af frame klassen, og vise det - ideen var så at når man trykkede på en knap som er beskrevet i en anden klasse at frame objektet skulle repaintes. mvh Mads
Avatar billede trp79 Nybegynder
19. januar 2004 - 14:59 #10
Det vil sige at du opretter to objekter i din main metode?
Her kommer lige en måde at gøre det på - skulle jeg mene...
Jeg går ud fra at du har:
en main klasse (MainClass)
din frame klasse (frame)
din anden klasse (klasse2)

Understående foregår i din main klasses main metode:
1) Du opretter guiObjekt (Gui guiObjekt = new Gui();)
2) Du opretter et objekt af klasse2 og sender guiObjekt med derovre som parameter - modtager det og lave repaint hvor du vil på objektet.

Er det helt ved siden af hvordan du gør det? det er i hvert fald en mulig løsning på dit problem... Kan du følge mig?
Avatar billede _carsten Nybegynder
19. januar 2004 - 18:36 #11
Da jeg ikke kan finde ud af om du har fået løst problemet, og du åbenbart har rigelig med kode til at poste her, så får du lige et lille eksempel at grave i.
Måske kan det give dig en ide om hvordan du kan løse det.

public class Exp extends javax.swing.JFrame {

    public Exp() {
        initComponents();       
    }
   
    private void initComponents() {
        panel2 = new javax.swing.JPanel();
        panel1 = new javax.swing.JPanel();
        panel3 = new javax.swing.JPanel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        item1 = new javax.swing.JMenuItem();
        item2 = new javax.swing.JMenuItem();

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        panel2.setBackground(new java.awt.Color(51, 51, 255));
        getContentPane().add(panel2, java.awt.BorderLayout.CENTER);

        panel1.setBackground(new java.awt.Color(255, 0, 51));
        getContentPane().add(panel1, java.awt.BorderLayout.NORTH);

        panel3.setBackground(new java.awt.Color(255, 255, 0));
        getContentPane().add(panel3, java.awt.BorderLayout.SOUTH);

        jMenu1.setText("Menu");
        item1.setText("Tilf\u00f8j gult panel");
        item1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addOrRemove(evt);
            }
        });

        jMenu1.add(item1);

        item2.setText("Fjern gult panel");
        item2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                addOrRemove(evt);
            }
        });

        jMenu1.add(item2);

        jMenuBar1.add(jMenu1);

        setJMenuBar(jMenuBar1);

        setSize(300,360);
        panel1.setPreferredSize(new java.awt.Dimension(300, 100));
        panel2.setPreferredSize(new java.awt.Dimension(300, 100));
        panel3.setPreferredSize(new java.awt.Dimension(300, 100));
        item1.setEnabled(false);

        pack();
    }

    private void addOrRemove(java.awt.event.ActionEvent evt) {
        if(evt.getSource() == item1){
            getContentPane().add(panel3);
            item2.setEnabled(true);
            item1.setEnabled(false);
        }
        else{
            remove(panel3);
            item2.setEnabled(false);
            item1.setEnabled(true);
        }
       
        repaint();
    }
   

    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public static void main(String args[]) {
        new Exp().show();
    }

    private javax.swing.JMenuItem item1;
    private javax.swing.JMenuItem item2;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JPanel panel1;
    private javax.swing.JPanel panel2;
    private javax.swing.JPanel panel3;
}
Avatar billede kagehuset Nybegynder
19. januar 2004 - 22:30 #12
Hejsa... Jeg har fået løst mit problem - men smid lige nogle svar så i kan få lidt point! mvh Mads
Avatar billede _carsten Nybegynder
19. januar 2004 - 22:37 #13
Kommer her.
Avatar billede trp79 Nybegynder
20. januar 2004 - 13:49 #14
Hvad var svaret så til dit problem? Noget af det vi har forsået? eller noget helt tredje?
Avatar billede kagehuset Nybegynder
20. januar 2004 - 17:03 #15
Hey... Det var det i foreslog der fik mig på rette køl - havde lige rod i hvilken klasse der skulle repaintes - men det hjalp lige at se lidt kode og så'n... Takker!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester