Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:20 Der er 26 kommentarer og
1 løsning

runtime - error

Hvad er problemet med følgende program - NB, har vedhæftet to klasser!

KLasse 1:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class Prove extends JFrame implements ActionListener
{
    private Button indsæt, slut;     //trykknapper til hhv. at indsætte i databasen og afslutte
    private TextField nr, navn;        //tekstfelter til hhv. varenr og -navn

    private Connection con;            //databaseforbindelses-objektet

    public Prove(Connection con)
    //konstruktør, sætter vinduet op
    {
        this.con= con;                    //overfør den modtagne databaseforbindelse

        setSize(80,280);                //sæt vinduets størrelse
        setLocation(100,100);            //og placering (målt i pixels)
        setTitle("Tilføj varer");

        Container cP= getContentPane();    //referer til 'contentPane'-laget med cP

        cP.setLayout(new FlowLayout());    //vælg layoutmanageren 'FlowLayout'

        cP.add(new Label("vare nr"));    //skriv ledeteksten 'vare nr'
        nr= new TextField(10);            //definer og tilføj tekstfeltet nr
        cP.add(nr);

        cP.add(new Label("vare navn"));    //do. for 'vare navn'
        navn= new TextField(10);        //..
        cP.add(navn);

        indsæt= new Button("indsæt");    //definer og tilføj indsæt-knappen
        cP.add(indsæt);
        indsæt.addActionListener(this);    //registrer indsæt-knappen, så tryk på
                                        //den kan opfanges

        slut= new Button("slut");        //definer og tilføj slut-knappen
        cP.add(slut);
        slut.addActionListener(this);    //registrer slut-knappen, så tryk på den
                                        //kan opfanges
    }

    public void actionPerformed(ActionEvent e)
    //metode, der kaldes automatisk, når brugeren trykker på én af de registrerede
    //trykknapper (indsæt eller slut).
    {
        if (e.getSource()==indsæt)        //hvis det var indsætknappen
        {
            try
            {

                //konstruer, send og udfør flg. sql-sætning:
                //INSERT INTO vare VALUES ('<intastet vare nr>', '<indtastet vare navn>')

                Statement s= con.createStatement();    //opretter sætningsobjektet

                String SQL= "INSERT INTO vare VALUES ('"
                                + Integer.parseInt(nr.getText()) + "','"
                                + navn.getText()+ "')";

                s.executeUpdate(SQL);

                System.out.println(SQL);    //udskriv den udførte sql-sætning på konsollen så den evt. kan kontrolleres
            }
            catch(Exception ex){System.out.println(ex);}
        }
        else if (e.getSource()==slut)            //ellers hvis det var slut-knappen
        {
            try
            {
                con.close();                    //nedlæg forbindelsen til myDB
            }
            catch (Exception ex){System.out.println(ex);}
            System.exit(0);                            //afslut
        }
    }
}

KLasse 2:
import java.sql.*;
import javax.swing.*;

public class LayoutDemo
{
static Connection con;
      public static void main(String[] args) throws Exception

  {

      //load driveren og opret et forbindelsesobjekt til myDB
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        Connection con = DriverManager.getConnection("jdbc:odbc:myDB");

      JFrame frame = new JFrame ("Layout Manager Demo");
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

      JTabbedPane tp = new JTabbedPane();
      //tp.addTab ("Oversigt", new IntroPanel());
      //tp.addTab ("Spm 3", new FlowPanel());
      //tp.addTab ("Spm 4", new BorderPanel());
      //tp.addTab ("Spm 5", new GridPanel());
      //tp.addTab ("Spm 6", new BoxPanel());
      tp.addTab ("Spm 7", new Prove(con));

      frame.getContentPane().add(tp);
      frame.pack();
      frame.show();
  }
}
Avatar billede arne_v Ekspert
17. marts 2003 - 11:24 #1
Kan du også poste den fejl du får ?
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:24 #2
jeg prøver lige...
Avatar billede soreno Praktikant
17. marts 2003 - 11:26 #3
En god teknik er at sætte System.out.println(".."); ind på strategiske steder - så kan du finde udaf hvilken linie der er skyld i fejlen.

Kan du ikke poste output fra programmet (altså den fejl der kommer)..
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:27 #4
Den angivne sti blev ikke fundet.
Exception in thread "main" java.lang.IllegalArgumentException: adding a window t
o a container
        at java.awt.Container.addImpl(Container.java:579)
        at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:568)
        at javax.swing.JTabbedPane.addTab(JTabbedPane.java:640)
        at LayoutDemo.main(LayoutDemo.java:26)
Tryk på en vilkårlig tast for at fortsætte . . .
Avatar billede arne_v Ekspert
17. marts 2003 - 11:30 #5
Fejlen er vel ret tydelig:

IllegalArgumentException: adding a window to a container

Jeg formoder at du ikke kan added en JFrame til en JTabbedPane.
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:32 #6
ikke tydelig for en begynder som jeg....Hvad gør jeg så?
Avatar billede soreno Praktikant
17. marts 2003 - 11:39 #7
Et bud ville være at ændre:
public class Prove extends JFrame implements ActionListener

til:
public class Prove extends JPanel implements ActionListener
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:40 #8
Det har jeg allerede forsøgt - hvilket giver følgende fejl:

Prove.java:20: cannot resolve symbol
symbol  : method setTitle  (java.lang.String)
location: class Prove
        setTitle("Tilføj varer");
                ^
Prove.java:22: cannot resolve symbol
symbol  : method getContentPane  ()
location: class Prove
        Container cP= getContentPane();    //referer til 'contentPane'-laget med cP
                              ^
2 errors
Avatar billede soreno Praktikant
17. marts 2003 - 11:43 #9
Du kan ikke sætte en titel på et panel.

Sæt den på din frame:
frame.setTitle("Tilføj varer");

den anden fejl *tror* jeg er fordi du ikke skal hente contentPane for at kunne adde komponenter, prøv:
this.setLayout(new FlowLayout());

osv.
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:56 #10
er ikke helt med - hvis jeg gør det første du siger kommer følgende fejl...

Prove.java:20: non-static method setTitle(java.lang.String) cannot be referenced from a static context
        Frame.setTitle("Tilføj varer");
Avatar billede soreno Praktikant
17. marts 2003 - 11:58 #11
Din variabel hedder:
frame - ikke Frame
:-)
Avatar billede web_the_world Nybegynder
17. marts 2003 - 11:58 #12
Hvad med dig Arne_v du har ikke et forslag?
Avatar billede web_the_world Nybegynder
17. marts 2003 - 12:01 #13
Nu har du helt sat mig...Hvad mener du?
Avatar billede soreno Praktikant
17. marts 2003 - 12:06 #14
Java er case-sensitive. Du skriver:
JFrame frame = new JFrame ("Layout Manager Demo");

Altså hedder din variabel "frame".

Du har tilsyneladende skrevet:
Frame.setTitle("Tilføj varer");

Det er ikke det samme som:
frame.setTitle("Tilføj varer");

Frame er en klasse i java.awt pakken og derfor siger den at du ikke kan referere til en metode fra en statisk sammenhæng.
Avatar billede arne_v Ekspert
17. marts 2003 - 12:06 #15
Du skal kalde setTitle på dit objekt af typen JFrame
ikke på klassen.
Avatar billede web_the_world Nybegynder
17. marts 2003 - 12:29 #16
ok, jeg er vist lidt tungnem i dag... i klassen Prove skal jeg ændre følgende:

public Prove(Connection con)
    //konstruktør, sætter vinduet op
    {
        this.con= con;                    //overfør den modtagne databaseforbindelse

        setSize(80,280);                //sæt vinduets størrelse
        setLocation(100,100);            //og placering (målt i pixels)
        setTitle("Tilføj varer");

        Container cP= getContentPane();    //referer til 'contentPane'-laget med cP

til
public Prove(Connection con)
    //konstruktør, sætter vinduet op
    {
        this.con= con;                    //overfør den modtagne databaseforbindelse

        setSize(80,280);                //sæt vinduets størrelse
        setLocation(100,100);            //og placering (målt i pixels)
        frame.setTitle("Tilføj varer");

        Container cP= getContentPane();    //referer til 'contentPane'-laget med cP

Men skal der stå:

public class Prove extends JFrame implements ActionListener

eller:
public class Prove extends JPanel implements ActionListener
Avatar billede soreno Praktikant
17. marts 2003 - 12:36 #17
public class Prove extends JPanel implements ActionListener
Avatar billede web_the_world Nybegynder
17. marts 2003 - 12:39 #18
men det andet var rigtig nok?
Avatar billede soreno Praktikant
17. marts 2003 - 12:41 #19
Sådan:

import java.sql.*;
import javax.swing.*;

public class LayoutDemo
{
static Connection con;
      public static void main(String[] args) throws Exception

  {
/*
      //load driveren og opret et forbindelsesobjekt til myDB
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

        Connection con = DriverManager.getConnection("jdbc:odbc:myDB");
*/
      JFrame frame = new JFrame ("Layout Manager Demo");
      frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      frame.setTitle("Jeg har glemt hvad title er.. - skriv den selv");
      JTabbedPane tp = new JTabbedPane();
      //tp.addTab ("Oversigt", new IntroPanel());
      //tp.addTab ("Spm 3", new FlowPanel());
      //tp.addTab ("Spm 4", new BorderPanel());
      //tp.addTab ("Spm 5", new GridPanel());
      //tp.addTab ("Spm 6", new BoxPanel());
      tp.addTab ("Spm 7", new Prove(con));

      frame.getContentPane().add(tp);
      frame.pack();
      frame.show();
  }
}


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;

public class Prove extends JPanel implements ActionListener
{
    private Button indsæt, slut;    //trykknapper til hhv. at indsætte i databasen og afslutte
    private TextField nr, navn;        //tekstfelter til hhv. varenr og -navn

    private Connection con;            //databaseforbindelses-objektet

    public Prove(Connection con)
    //konstruktør, sætter vinduet op
    {
        this.con= con;                    //overfør den modtagne databaseforbindelse

        setSize(80,280);                //sæt vinduets størrelse
        setLocation(100,100);            //og placering (målt i pixels)

        setLayout(new FlowLayout());    //vælg layoutmanageren 'FlowLayout'

        add(new Label("vare nr"));    //skriv ledeteksten 'vare nr'
        nr= new TextField(10);            //definer og tilføj tekstfeltet nr
        add(nr);

        add(new Label("vare navn"));    //do. for 'vare navn'
        navn= new TextField(10);        //..
        add(navn);

        indsæt= new Button("indsæt");    //definer og tilføj indsæt-knappen
        add(indsæt);
        indsæt.addActionListener(this);    //registrer indsæt-knappen, så tryk på
                                        //den kan opfanges

        slut= new Button("slut");        //definer og tilføj slut-knappen
        add(slut);
        slut.addActionListener(this);    //registrer slut-knappen, så tryk på den
                                        //kan opfanges
    }

    public void actionPerformed(ActionEvent e)
    //metode, der kaldes automatisk, når brugeren trykker på én af de registrerede
    //trykknapper (indsæt eller slut).
    {
        if (e.getSource()==indsæt)        //hvis det var indsætknappen
        {
            try
            {

                //konstruer, send og udfør flg. sql-sætning:
                //INSERT INTO vare VALUES ('<intastet vare nr>', '<indtastet vare navn>')

                Statement s= con.createStatement();    //opretter sætningsobjektet

                String SQL= "INSERT INTO vare VALUES ('"
                                + Integer.parseInt(nr.getText()) + "','"
                                + navn.getText()+ "')";

                s.executeUpdate(SQL);

                System.out.println(SQL);    //udskriv den udførte sql-sætning på konsollen så den evt. kan kontrolleres
            }
            catch(Exception ex){System.out.println(ex);}
        }
        else if (e.getSource()==slut)            //ellers hvis det var slut-knappen
        {
            try
            {
                con.close();                    //nedlæg forbindelsen til myDB
            }
            catch (Exception ex){System.out.println(ex);}
            System.exit(0);                            //afslut
        }
    }
}
Avatar billede soreno Praktikant
17. marts 2003 - 12:42 #20
Hov, du skal selv lige enable sql sektionen igen..
Avatar billede web_the_world Nybegynder
17. marts 2003 - 12:51 #21
Hvordan kan det være, at hvis jeg enable de andre faneblade...Så ligger det faneblad som hedder Prove ovenpå de andre første jeg går dem alle igennm, men efter at jeg har været på den "side" hvor den skal stå, så er de andre igen ok? Forstår du hvad jeg mener?
Avatar billede web_the_world Nybegynder
17. marts 2003 - 12:59 #22
og så lige et forståelses spm - hvad er forskellen på JFrame og JPanel...?
Avatar billede soreno Praktikant
17. marts 2003 - 13:02 #23
Prøv at kigge lidt på Panel her:
http://java.sun.com/docs/books/tutorial/uiswing/components/components.html

Hvis man kigger på hierarkiet til JFrame så ser det sådan ud:
(Ser sikkert dumt ud hvis ikke det vises med en monospace font - f.eks. courier..)
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--java.awt.Window
                    |
                    +--java.awt.Frame
                          |
                          +--javax.swing.JFrame

Mens JPanel ser sådan ud:
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JPanel
Avatar billede web_the_world Nybegynder
17. marts 2003 - 13:05 #24
ok, men hvad mener du med det - dit flotte skema? Er vist ikke så skarp til java som jeg håbede...:)) - og hvad mit andet problem - hvorfor skriver det ovenpå alle de andre faneblade?
Avatar billede soreno Praktikant
17. marts 2003 - 13:05 #25
Altså har de forskellige egenskaber. Jeg ved ikke nok om Swing til at kunne liste disse.

Men jeg er sikker på at Suns Swing tutorial kan besvare mange spørgsmål:
http://java.sun.com/docs/books/tutorial/uiswing/components/index.html

Ang. JTabbedPane så ved jeg ikke helt hvad der går galt - jeg er langt fra Swing ekspert.
:-)
Avatar billede soreno Praktikant
17. marts 2003 - 13:06 #26
Arve hierarkiet fortæller hvilke klasser som f.eks. JPanel arver egenskaber (metoder, variabler) fra.
Avatar billede web_the_world Nybegynder
17. marts 2003 - 13:10 #27
Ok, takker...Du har i hvert fald løst det største problem....

Måske du Arne kan hjælpe mig med et sidste?

Hvordan kan det være, at hvis jeg enable de andre faneblade...Så ligger det faneblad som hedder Prove ovenpå de andre første jeg går dem alle igennm, men efter at jeg har været på den "side" hvor den skal stå, så er de andre igen ok? Forstår du hvad jeg mener?
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