Avatar billede trp79 Nybegynder
19. december 2002 - 11:33 Der er 6 kommentarer og
1 løsning

Swing, får fejl ang. static context...

Hej jeg vil har hentet langt det meste af understående kode fra sun site. Jeg vil så gerne udbygge den så jeg kan skrive direkte fra main metoden til tekstarea. Det kan jeg ikke som den er nu. Jeg får følgende fejl når jeg prøver:

C:\Documents and Settings\Torben Pedersen\Skrivebord\toolBarDemo\toolBarDemo.java:95: non-static method displayResult(java.lang.String) cannot be referenced from a static context
        displayResult("Hello");
        ^
1 error

Tool completed with exit code 1

Jeg forstår ikke helt hvad fejlen er, håber nogle kan hjælpe mig med den. Der er vel også en grundt til at sun har bygget det op sådan, håber også nogen kan forklarer det.

Her kommer koden:
import javax.swing.JToolBar;
import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.util.*; //Til dato
import java.text.*; //Til dato
public class toolBarDemo extends JFrame {
    protected JTextArea textArea;
    protected String newline = "\n";
    static String a="hej";

    Locale indstillinger = Locale.getDefault();       
    DateFormat fullFormat = DateFormat.getDateInstance (DateFormat.FULL, indstillinger); //19 december 2002
    DateFormat mediumFormat = DateFormat.getTimeInstance (DateFormat.MEDIUM, indstillinger);//10:15:12

    public toolBarDemo() {
        //Do frame stuff.
        super("ToolBarDemo");
        addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
        System.exit(0);
            }
        });
        //Create the toolbar.
        JToolBar toolBar = new JToolBar();
        addButtons(toolBar);

        //Create the text area used for output.
        textArea = new JTextArea(5, 30);
        JScrollPane scrollPane = new JScrollPane(textArea);

        //Lay out the content pane.
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.setPreferredSize(new Dimension(400, 100));
        contentPane.add(toolBar, BorderLayout.NORTH);
        contentPane.add(scrollPane, BorderLayout.CENTER);
        setContentPane(contentPane);
    }  protected void addButtons(JToolBar toolBar) {
        JButton button = null;

        //first button
        button = new JButton(new ImageIcon("images/leftarrow.gif"));
        button.setToolTipText("This is the left button");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Date today = new Date();
                displayResult(fullFormat.format(today));
            }
        });
        toolBar.add(button);

        //second button
        button = new JButton(new ImageIcon("images/exit.gif"));
        button.setToolTipText("This is the middle button");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Date now = new Date();
                displayResult(mediumFormat.format(now)+": Action for second button");
            }
        });
        toolBar.add(button);
        //third button
        button = new JButton(new ImageIcon("images/rightarrow.gif"));
        button.setToolTipText("This is the right button");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Date now = new Date();
                displayResult(mediumFormat.format(now)+": Action for third button");
            }
        });
        toolBar.add(button);
    }
    protected void displayResult(String actionDescription) {
        textArea.append(actionDescription + newline);
    }
    public static void main(String[] args) {
        toolBarDemo frame = new toolBarDemo();
        frame.pack();
        frame.setVisible(true);
        displayResult("Hello");

    }
}
Avatar billede bearhugx Nybegynder
19. december 2002 - 11:37 #1
du skal kalde
  frame.displayResult("Hello");
i stedet
Avatar billede bearhugx Nybegynder
19. december 2002 - 11:41 #2
Grunden er, at du fra main metoden (som er i static context = kan kaldes selvom der ikke bruges initialiseret objekt) forsøger at kalde metoden displayResult() - Ved at du ikke har et initialiseret objekt foran (frame f.eks.) så vil den forsøge at kalde denne (ikke statiske) metode, som om den var en statisk metode - og det er den ikke...

Derfor skal du putte den initialiserede objekt foran metodekaldet ("frame.")...

/Søren Munk Skrøder
Avatar billede trp79 Nybegynder
19. december 2002 - 11:47 #3
Det var pokkerts, det virker jo :o)
Du får mange tak for det hurtige svar og ikke mindst forklaringen :o)
Avatar billede bearhugx Nybegynder
19. december 2002 - 11:56 #4
Takker for points

En lille oversigt :
Du har brug for at sætte "initialiseret objekt" foran metodekaldet når følgende er gældende :
- Du kalder en ikke-statisk metode fra statisk kontekst (en static-metode, feks. main)
- Du kalder en ikke-statisk metode i et andet objekt

Du kan kalde metoden uden initialiseret objekt foran hvis
- Du kalder en ikke-statisk metode fra ikke-statisk kontekst i samme klasse, (eller efterfølger af klassen)

Du skal både have klassenavn og metodenavn hvis
- du forsøger at kalde en statisk metode i en klasse (f.eks HTMLUtils.encode(string) ) <-- eget eksempel...

/Søren
Avatar billede trp79 Nybegynder
19. december 2002 - 12:16 #5
Kan du evt. give eksempler på overstående? Jeg er allerede løbet ind i problemer igen. Hvis jeg f.eks. i main skriver:

Date now = new Date();
frame.displayResult(mediumFormat.format(now));

får jeg samme fejl...(non static variabel mediumFormat cannot be referened from a static context frame.displayResult(mediumFormat.format(now));
Det er vel den fejl du nævner først, men initialiseringen af objektet (frame) har jeg da gjort.. Eller kan jeg bare ikke helt finde rundt i static kontra non-static?
mvh
Torben
Avatar billede bearhugx Nybegynder
19. december 2002 - 12:53 #6
*undskyld ventetiden - var lige til frokost*

problemet ligger i, at variabler, som er defineret i en klasse, kun kan tilgås fra statiske metoder, hvis de selv er erklæret static.

Men råd til dig er, at tage de kald, som du har i main-metoden - og så læg dem ind som en metode i frameobjektet i stedet - Det er besværligt heletiden at skulle arbejde i static context, når man pricipielt ikke er nødt til det...

Her er noget kode :


public class ToolBarDemo extends JFrame {
...
...
  public void doIt() {
    pack();
    setVisible(true);
    displayResult("Hello");
    Date now = new Date();
    displayResult(mediumFormat.format(now));
  }

  public static void main(String[] args) {
    ToolBarDemo tbd = new ToolBarDemo();
    tbd.doIt();
  }
}
Avatar billede trp79 Nybegynder
19. december 2002 - 12:59 #7
Det vil jeg gøre :o) Du får mange tak
God Jul...
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