Avatar billede fastpoint Nybegynder
14. januar 2005 - 21:44 Der er 45 kommentarer og
1 løsning

Hjælp til anvendelse af komponenter

Okay jeg forstår ikke helt hvordan man skal bruge komponenter, som JTable, JOptionPane og alle de andre.. når man skal tilføje noget i dem står der at man skal have minimum et komponent med eller et komponent og en String.

Hvis vi siger jeg vil anvende en JOptionPane og jeg vil sætte noget information ind i den. Hvordan gør jeg så det ? Det er dette objekt jeg vil indsætte et par stykker af





package mypackage;
import java.io.Serializable;
import java.util.ArrayList;

public class Elev implements Serializable
{

private String fornavn;
private String efternavn;
private ArrayList mineOpgaver;

  public Elev(String f, String e)
  {
  fornavn = f;
  efternavn = e;
  mineOpgaver = new ArrayList();
  }
 
  public String hentEnavn()
  {
    return efternavn;
  }
 
    public String hentfNavn()
  {
    return fornavn;
  }
 
  public void indsætOpgave(Opgave opg)
  {
    mineOpgaver.add(opg);
  }
 
  public ArrayList minListe()
  {
    return mineOpgaver;
  }
}





Og er faktisk at få udskrevet informationen fra metoden hentfNavn() i min JOptionPane.

Men der er ikke en metode der bare kan tilføje en String! men et komponent.. så hvordan gør man? hvordan skal det forstås?

Pointsatsen er høj fordi der nok dukker flere spørgsmål op imens jeg prøver at udføre det:)
Avatar billede arne_v Ekspert
14. januar 2005 - 21:46 #1
Swing applikationer er et stort område.

Og du skal nok starte med at læse lidt.

F.eks. http://java.sun.com/docs/books/tutorial/uiswing/
Avatar billede arne_v Ekspert
14. januar 2005 - 21:47 #2
Simpelt eksempel:

import java.util.*;
import java.text.*;
import javax.swing.*;

public class SimpleGUI extends JFrame {
  public SimpleGUI() {
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      Date date = new Date();
      SimpleDateFormat df = new SimpleDateFormat("ddMMyy");
      String s = df.format(date);
      getContentPane().add(new JLabel("Today: " + s));
      pack();
  }
  public static void main(String[] args) {
      SimpleGUI f = new SimpleGUI();
      f.show();
  }
}
Avatar billede arne_v Ekspert
14. januar 2005 - 21:49 #3
JOptionPane er dog speciel ved at du kan bruge den uden "den sædvanelige Swing kontekst".
Avatar billede arne_v Ekspert
14. januar 2005 - 21:49 #4
JOptionPane.showMessageDialog(null, "Bla bla bla");
Avatar billede arne_v Ekspert
14. januar 2005 - 21:50 #5
String s = JOptionPane.showInputDialog(null, "Indtast xxxx");
Avatar billede fastpoint Nybegynder
14. januar 2005 - 21:54 #6
Sorry!! Mente slet ikke JOptionPane.. men JScrollPane
Hvordan skal jeg får fornavn smit ind i sådan en?
Avatar billede arne_v Ekspert
14. januar 2005 - 21:58 #7
Den bruger du ikke bare.

Den bruges til at sætte en scrollbar på et JTextArea.

Man erstatter:

getContentPane().add(mytextarea);

med:

getContentPane().add(new JScrollPane(mytextarea));
Avatar billede arne_v Ekspert
14. januar 2005 - 21:59 #8
Og så er du langt inde i en rigtigt Swing app.
Avatar billede arne_v Ekspert
14. januar 2005 - 22:00 #9
Hvis du skal lære at lave en GUI app, så start med den tutorial som jeg gav link til.

Hvis du skal skal udskrive og indlæse noget, så brug de 2 JOptionPane kald
jeg viste.
Avatar billede fastpoint Nybegynder
14. januar 2005 - 22:02 #10
problemet er vi er blevet sat ind i GUI programmering dog ikke hvordan man anvender sådan nogen komponenter, men kan godt se hvad du mener med JScrollPane, og det er let nok at sætte tekst ind i en JTextArea.
Hvad så hvis det var en JTable?
Avatar billede fastpoint Nybegynder
14. januar 2005 - 22:03 #11
Jeg skal nok også kigge på dit link men må prøve at hive så meget til mig så hurtigt som muligt..desværre
Avatar billede arne_v Ekspert
14. januar 2005 - 22:11 #12
Endnu et simpelt eksempel:

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

public class SimpleDBGUI extends JFrame implements ActionListener {
  private JButton find;
  private JTextField kunde;
  private JTextArea res;
  public SimpleDBGUI() {
      getContentPane().setLayout(new BorderLayout());
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400, 400);
      kunde = new JTextField();
      getContentPane().add(kunde, BorderLayout.NORTH);
      res = new JTextArea();
      getContentPane().add(res, BorderLayout.CENTER);
      find = new JButton("Søg");
      find.addActionListener(this);
      getContentPane().add(find, BorderLayout.SOUTH);
  }
  public void actionPerformed(ActionEvent evt) {
      try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        Connection con = DriverManager.getConnection("jdbc:odbc:TestMSAccess");
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT * FROM T1 WHERE F2='" + kunde.getText() + "'");
        while (rs.next()) {
            int ifelt = rs.getInt(1);
            String sfelt = rs.getString(2);
            res.setText(res.getText() + ifelt + " " + sfelt + "\r\n");
        }
      } catch (ClassNotFoundException e) {
        e.printStackTrace();
      } catch (SQLException e) {
        e.printStackTrace();
      }
  }
  public static void main(String[] args) {
      SimpleDBGUI f = new SimpleDBGUI();
      f.show();
  }
}
Avatar billede fastpoint Nybegynder
14. januar 2005 - 22:32 #13
men hvad med en JTable?

og angående det spørgsmål jeg blev stillet hvordan kan jeg lettest udskrive min liste af elever?
Jeg tænker på et textaria, men der er måske noget bedre og lettere?
Avatar billede arne_v Ekspert
14. januar 2005 - 22:35 #14
Det er jo nemt at skovle det hele ind i et JTextArea. En løkke som henter dem
alle og appender en linie me dtext afsluttet med \r\n.

Men det er langt pænere med en JTable.

Desværre rækker min Swing viden ikke til at lege med JTable og den slags.

Der skal du nok satse på carsten eller en af de andre som gør i den slags.
Avatar billede fastpoint Nybegynder
14. januar 2005 - 22:39 #15
Det okay, men hvis du ikke programmere med Swing så meget hvad programmere du så? databaser?
Avatar billede arne_v Ekspert
14. januar 2005 - 23:02 #16
Databaser, XML, web services, sockets, J2EE etc.
Avatar billede kalp Novice
14. januar 2005 - 23:29 #17
14/01-2005 21:58:47

Det slet ikke for at rette på det eller noget kan godt være det fungere:)
men jeg er mere sikker på følgende fungere

Hvis du opretter objekterne først
JScrollPane jScrollPane1 = new JScrollPane();
JTextArea jTextArea1 = new JTextArea();


sæt ScrollBar på TextArea

jScrollPane1.add(jTextArea1);

så fungere det :)


Men som arne skrev vent hellere på nogen af Dem som er mere inde i SWING..
Avatar billede kalp Novice
14. januar 2005 - 23:32 #18
hmm måske er jeg ikke så sikker nu jeg tænker over det
Avatar billede kalp Novice
14. januar 2005 - 23:38 #19
sorry til begge.. dette vil fungere

JTextArea jTextArea1 = new JTextArea();
JScrollPane jScrollPane1 = new JScrollPane(jTextArea1);

og så kan du bare tilføje din jScrollPane1 til et Panel eller som arne foreslog:)
Avatar billede snoop_one Nybegynder
15. januar 2005 - 17:46 #20
hmmm dette her lyder bekendt :-)
http://www.eksperten.dk/spm/580202
Avatar billede fastpoint Nybegynder
15. januar 2005 - 18:01 #21
snoop_one Ja det sandt men spørgsmålet her er ikke det samme som i det andet.

Arne kan du hjælpe med dette istedet så får du i hverfald 50Point af de 200Point. Synes ikke der er grund til at oprette et nyt spørgsmål.

Jeg får denne fejl

Error(45,12): variable required, but value found


  for (int i = 0 ; i < mineOpgaver.size() ; i++ )
    {
      for (int b = 1 ; b < mineOpgaver.size()-1 ; b++ )
      {
        if(((Opgave)mineOpgaver.get(i)).hentNummer() > ((Opgave)mineOpgaver.get(b)).hentNummer())
        {
          tmp = ((Opgave)mineOpgaver.get(i));
          ((Opgave)mineOpgaver.get(i)) =  ((Opgave)mineOpgaver.get(b));
          ((Opgave)mineOpgaver.get(b)) = tmp;
        // ((Opgave)mineOpgaver.get(i)).bytPlads(((Opgave)mineOpgaver.get(b)).hentTitel(), ((Opgave)mineOpgaver.get(b)).hentNummer(), ((Opgave)mineOpgaver.get(b)).hentStatus());
      //  ((Opgave)mineOpgaver.get(b)).bytPlads(tmp.hentTitel(), tmp.hentNummer(), tmp.hentStatus());
        }
      }
     
    }


hvorfor kan jeg ikke det??
I den udkommenterede har jeg lavet en metode hvor jeg går ind i hvert objekt og ændre de forskellige værdier men det besværlig og output stemmer ikke.

Er det rigtig sat op? Den skal sortere..
Avatar billede arne_v Ekspert
15. januar 2005 - 18:04 #22
Hvilken linie er linie 45 ?
Avatar billede snoop_one Nybegynder
15. januar 2005 - 18:22 #23
Hej fastpoint (jeg er ikke arne_v :0) men...), du kan indkode selve sorteringen i din opgave klasse ved at benytte java's Comparable interface. Som f.eks.

/*
* Created on 2005-01-15
*
*/

import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;

/**
* @author Snoop_one
*/
public class Opgave implements Comparable {

    private int nummer;

    public Opgave(int nummer) {
        this.nummer = nummer;
    }

    public static void main(String[] args) {
        //Lav en random generator til tilfældige tal
        Random random = new Random();
        ArrayList<Opgave> opgaver = new ArrayList<Opgave>();
        for(int i = 0;i<100;i++){
            // lav en masse opgaver med forskellige værdier mellem 0-99
            opgaver.add(new Opgave(random.nextInt(100)));
        }
        // usorteret udgave (normal udgave)
        System.out.println(opgaver);
        //sortere dem alle
        Collections.sort(opgaver);
        //udskriv dem (sorteret udgave)
        System.out.println(opgaver);
    }
   
    public int compareTo(Object o) {
        if (o instanceof Opgave)
            return (this.nummer - ((Opgave) o).getNummer());
        else
            return 0;
    }

    public int getNummer() {
        return nummer;
    }
   
    public String toString(){
        return Integer.toString(nummer);
    }
}

Håber det giver lidt inspiration...
Avatar billede fastpoint Nybegynder
15. januar 2005 - 18:35 #24
Til arne

    tmp = ((Opgave)mineOpgaver.get(i));
          ((Opgave)mineOpgaver.get(i)) =  ((Opgave)mineOpgaver.get(b));
          ((Opgave)mineOpgaver.get(b)) = tmp;

Det er linie nummer to. får også samme fejl ved linie nummer tre, men nummer et virker fint!


Til Snoop

Jeg ser tit den kode men skal nok have en kommentar til hver sætning for at forstå det helt præcist derfor jeg laver min egen sorteringsmetode. Vil spørge min lærer om Comparable

Og forresten i min klasse elev er der et arraylist med opgave objekter.
Så det er vel i Elev den metode der skal være?
Avatar billede snoop_one Nybegynder
15. januar 2005 - 18:54 #25
Ja for at benytte comparable generelt skal man overholde en kontrakt (som ikke er så simpel), men eftersom det i det tilfælde kun gælder for primitive typer (integers) så skal du bare i din compareTo(Object o) metode angive placeringen af det object's nummer du sammenligner med iht. dit eget object's nummer. Dvs. hvis :

o.getNummer() < dit nummer -> return 1
o.getNummer() == dit nummer -> return 0
o.getNummer() > dit nummmer -> return -1

Det er det denne linie gør: return (this.nummer - ((Opgave) o).getNummer());
Så styre collections frameworket resten.

Det med at hvor Collections.sort(opgaver) metoden skal ligger, er jeg enig i - at den skal ligge i elev klassen.
Avatar billede arne_v Ekspert
15. januar 2005 - 18:57 #26
Ah ja.

((Opgave)mineOpgaver.get(i)) er en værdi og ikke en variabel og derfor kan den
kun optræde på højre side af ligheds tegn !
Avatar billede arne_v Ekspert
15. januar 2005 - 19:08 #27
Collections.sort er nok den nemmeste løsning.

Men ellers prøv og erstat:

tmp = ((Opgave)mineOpgaver.get(i));
((Opgave)mineOpgaver.get(i)) =  ((Opgave)mineOpgaver.get(b));
((Opgave)mineOpgaver.get(b)) = tmp;

med

tmp = (Opgave)mineOpgaver.get(i);
mineOpgaver.set(i, mineOpgaver.get(b));
mineOpgaver.set(b, tmp);
Avatar billede fastpoint Nybegynder
15. januar 2005 - 19:08 #28
((Opgave)mineOpgaver.get(i))

hmm.. hvad mener i med det er en værdi? kan godt se man sige get(i) og i er en værdi men hvad med objektet som der peges på? trænger lige til at vågne op:) forklar det lige hurtigt så er jeg med:) fik løst problemet som jeg skrev ved at lave en metode til det (det som er kommenteret ud)

og ellers er der en anden måde at få dem til at bytte plads på?
Avatar billede arne_v Ekspert
15. januar 2005 - 19:10 #29
Du kan skrive:

v = 1;

men ikke:

1 = v;

Og for hvad du kan gøre se min 19:08:09 kommentar.
Avatar billede fastpoint Nybegynder
15. januar 2005 - 19:21 #30
Det virker også det der arne:) smart metode den der set()

okay men der er stadig et problem.. den sortere sgu ikke som den skal:/ men metoden er da rigtig er den ikke?
De største skal stå øverst!

hvis den er rigtig kan jeg lige vise jer den kode som udskriver det.. måske det er der
Avatar billede arne_v Ekspert
15. januar 2005 - 19:24 #31
Gæt:


  for (int i = 0 ; i < mineOpgaver.size() ; i++ )
    {
      for (int b = 1 ; b < mineOpgaver.size()-1 ; b++ )

skal være:


  for (int i = 0 ; i < mineOpgaver.size() - 1; i++ )
    {
      for (int b = i ; b < mineOpgaver.size(); b++ )

[den sidste løkke starter med bogstavet i ikke med tallet 1 !]
Avatar billede fastpoint Nybegynder
15. januar 2005 - 19:37 #32
Satans! Det sandt nok! okay du er sikret dig 50p indtil videre

forstår det ikke lige

for mig ser det ud som om der står sådan her hvis vi nu mineOpgaver.size() returnere 5 for eksempel

første gang løkken køres

for (int i = 0 ; i < 5-1 ; i++ )
    {
      for (int b = i(0) ; b < 5; b++ )
      {
        if(((Opgave)mineOpgaver.get(i(0)).hentNummer() < ((Opgave)mineOpgaver.get(0(b)).hentNummer())
        {



man sammenligner opgaven med sig selv?
Avatar billede arne_v Ekspert
15. januar 2005 - 19:47 #33
Streng taget skal det vel være:

for (int i = 0 ; i < mineOpgaver.size() - 1; i++ )
    {
      for (int b = i+1 ; b < mineOpgaver.size(); b++ )

men if'en er aldrig opfyldt for b=i så forskellen er ens som man siger
Avatar billede arne_v Ekspert
15. januar 2005 - 19:50 #34
for i = 0..4
  for b = i+1..5

vil i første gennemløb af yderste løkke sammenligne element 0 med
element 1..5 og swappe således at element 0 er det mindste/største

vil i andet gennemløb af yderste løkke sammenligne element 1 med
element 2..5 og swappe således at element 1 er det næstmindste/næststørste

etc.
Avatar billede arne_v Ekspert
15. januar 2005 - 19:51 #35
Iøvrigt synes jeg stadig at du skal lære at bruge Comparable og dens fætter
Comparator
Avatar billede fastpoint Nybegynder
15. januar 2005 - 21:43 #36
Arne 50point mere hvis du svare på dette (så det 100 ialt)

mSQL er det Access Database?


og jeg får denne fejl når jeg lukker mit program


xception in thread main
java.lang.NullPointerException

    at javax.swing.text.PlainView.getLineWidth(PlainView.java:630)

    at javax.swing.text.PlainView.getPreferredSpan(PlainView.java:214)

    at javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1238)

    at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:808)

    at javax.swing.JComponent.getPreferredSize(JComponent.java:1275)

    at javax.swing.JTextArea.getPreferredSize(JTextArea.java:612)

    at javax.swing.ScrollPaneLayout.layoutContainer(ScrollPaneLayout.java:769)

    at java.awt.Container.layout(Container.java:1020)

    at java.awt.Container.doLayout(Container.java)

    at java.awt.Container.validateTree(Container.java:1090)

    at java.awt.Container.validateTree(Container.java:1101)

    at java.awt.Container.validateTree(Container.java:1101)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validateTree(Container.java:1099)

    at java.awt.Container.validate(Container.java:1067)

    at java.awt.Window.show(Window.java:461)

    at java.awt.Component.show(Component.java:1133)

    at java.awt.Component.setVisible(Component.java:1088)

    at mypackage.Start.<init>(Start.java:32)

    at mypackage.Start.main(Start.java:50)




hvad betyder det? har det noget med TextArea at gøre?  det først når jeg lukker den kommer
Avatar billede arne_v Ekspert
15. januar 2005 - 21:45 #37
Avatar billede fastpoint Nybegynder
15. januar 2005 - 21:47 #38
okay hvad med fejlen hvad kan det være?
og kender du en tutorial til Access database?
Avatar billede arne_v Ekspert
15. januar 2005 - 21:48 #39
Fejlen kan jeg ikke umiddelbart forklare.

Det er dit JTextArea.

Og der er et eller andet som er sat forkert.

Et aller ander relateret til størrelse.

Men nærmere kan jeg ikke komme det udfra de foreliggende oplsyninger.
Avatar billede arne_v Ekspert
15. januar 2005 - 21:50 #40
Få fat i et af de små Access hæfter som kan fåes mange steder for næsten ingen penge.

Ellers er der også en del på nettet. Google finder bl.a.:

http://www.bcschools.net/staff/AccessHelp.htm
Avatar billede arne_v Ekspert
15. januar 2005 - 21:53 #41
Vær opmærksom på at der ikke findes en pure java JDBC driver til MS Access.

D.v.s. at du skal bruge SUN JDBC ODBC bridge.

Og den har en del restriktioner. Bl.a. ikke thread safe !

Men til simple standalone applikationer på skole niveau er den helt fin.

Men til mere krævende brug vil jeg fraråde Access til Java.
Avatar billede fastpoint Nybegynder
16. januar 2005 - 14:47 #42
jeg har kigget på linket og synes kun der står hvordan man laver en database? jeg tænkte mere på hvordan sætter man noget ind i den?

Hvis man har disse felter i sin database

ID
Fornavn
Efternavn

hvordan opretter man en forbindelse og sætter noget ind her? Ville være dybt taknemlig hvis du kan lave et eksempel ud fra disse og resten af points tilfalder dig!

På formen behøves der kun være to jTextFields og en knap til at udføre det.
Avatar billede arne_v Ekspert
16. januar 2005 - 16:08 #43
Hente fra database:

      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
      Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\\Database\\MSAccess\\Test.mdb;Uid=Admin;Pwd=;");
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM T1");
      while(rs.next()) {
        System.out.println(rs.getInt(1) + " " + rs.getString(2));
      }
Avatar billede arne_v Ekspert
16. januar 2005 - 16:10 #44
Indsætte i database:

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection("jdbc:odbc:;Driver={Microsoft Access Driver (*.mdb)};Dbq=D:\\Database\\MSAccess\\Test.mdb;Uid=Admin;Pwd=;");
Statement stmt = con.createStatement();
int f1 = 123;
String f2 = "ABC";
stmt.executeUpdate("INSERT INTO T1 VALUES (" + f1 + ",'" + f2 + "')");
Avatar billede fastpoint Nybegynder
16. januar 2005 - 18:23 #45
læg et svar jeg takker for din hjælp:)
Avatar billede arne_v Ekspert
16. januar 2005 - 18:45 #46
svar
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