Avatar billede james_t_dk Juniormester
18. marts 2001 - 18:16 Der er 12 kommentarer og
1 løsning

showStatus og ikke \"applet started\"

Hej
Jeg har et lille problem med et stykke kode. Koden virker faktisk, men når appletten er startet skal den skrive et regne stykke i status linien, og ikke \"applet started\"

Det er i \"public void question ()\" at problemet opstår. Ved start af appletten skriver den faktisk til status linien, og hvis det lykkedes at gætte det rigtige tal virker appletten også bagefter. Men kan man på nogen måde forhindre den i at skrive \"applet started\"? Så den ikke overskriver mit regnestykke?

Her er hele koden, så kan i jo selv prøve det, jeg bruger Java2. (ses på at jeg kalder swing):

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

public class XtimesY extends JApplet implements ActionListener
{
JTextField result, answer;
int Value1, Value2;

// FINAL VAR (konstanter)
final int LOW = 1;
final int HIGH = 9;

public void init ( )
{
Container c = getContentPane ( );
c.setLayout ( new FlowLayout ( ) );

answer = new JTextField ( 20 );
answer.setEditable ( false );
c.add ( answer );

result = new JTextField ( 20 );
result.setEditable ( true );
result.addActionListener ( this );
c.add ( result );

}

public void main ()
{
question ();
}

public void actionPerformed ( ActionEvent e )
{
control ( );
}

public void question ( )
{
Value1 = RandomInteger ( LOW, HIGH );
Value2 = RandomInteger ( LOW, HIGH );
showStatus ( \"How much is \" + Integer.toString (
Value1 ) + \" times \" + Integer.toString ( Value2 ) );
}

public void control ( )
{
int Result;

Result = Integer.parseInt ( result.getText ( ) );

if ( Result == ( Value1 * Value2 ) )
{
answer.setText ( \"Very good\" );
question ( );
}
else
{
answer.setText ( \"No. Please try again\" );
}
}

public int RandomInteger ( int y, int z )
{
int x;

x = y + ( int ) ( Math.random () * z );
return x;
}
}
Avatar billede mpultz Nybegynder
19. marts 2001 - 16:58 #1
Hvad bruger du din main() metode til? Prøve f.eks. at kalde question() sidst i init metoden (eller sidst i start metoden). Hvis det ikke virker kan du starte en timer i din init metode som efter en kort venteperiode kalder question(). Se javax.swing.Timer klassen.
Avatar billede james_t_dk Juniormester
19. marts 2001 - 18:12 #2
Jeg ved at det ikke duer med start, main har egentligt samme funktion, Jeg prøver lige det med init.
Avatar billede mpultz Nybegynder
19. marts 2001 - 20:24 #3
main() vil aldrig blive kaldt i din applet, med mindre du gør det explicit.
Avatar billede james_t_dk Juniormester
19. marts 2001 - 20:33 #4
Om main bliver kaldt eller ej, så er slut resultatet det samme.

Så det løser ikke at ændre main til start. Derfor er problemet stadig ikke løst.
Avatar billede mpultz Nybegynder
20. marts 2001 - 17:49 #5
Fik du det til at virke med init()?
Avatar billede james_t_dk Juniormester
21. marts 2001 - 11:04 #6
init () giver samme resultat som start () det er det en brøkdel af et sekund, så bliver det overskrevet!
Avatar billede james_t_dk Juniormester
21. marts 2001 - 13:27 #7
Denne kode virker!

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

public class XtimesY extends JApplet implements ActionListener
{
JTextField result, answer;
int Value1, Value2;
String message;
// FINAL VAR (konstanter)
final int LOW = 1;
final int HIGH = 9;

public void init ( )
{
Container c = getContentPane ( );
c.setLayout ( new FlowLayout ( ) );

answer = new JTextField ( 20 );
answer.setEditable ( false );
c.add ( answer );

result = new JTextField ( 20 );
result.setEditable ( true );
result.addActionListener ( this );
c.add ( result );
question ();
}

public void actionPerformed ( ActionEvent e )
{
control ( );
}

public void question ( )
{
Value1 = RandomInteger ( LOW, HIGH );
Value2 = RandomInteger ( LOW, HIGH );
message = \"How much is \" + Integer.toString ( Value1 ) + \"
times \" + Integer.toString ( Value2 );
repaint();
}

public void paint(Graphics g)
{
super.paint(g);
getAppletContext().showStatus(message);
}
public void control ( )
{
int Result;

Result = Integer.parseInt ( result.getText ( ) );

if ( Result == ( Value1 * Value2 ) )
{
answer.setText ( \"Very good\" );
question ( );
}
else
{
answer.setText ( \"No. Please try again\" );
}
}
public int RandomInteger ( int y, int z )
{
int x;

x = y + ( int ) ( Math.random () * z );
return x;
}

}

Avatar billede james_t_dk Juniormester
21. marts 2001 - 13:28 #8
Men ikke fordi question ( ) er i init ( ).
Avatar billede mpultz Nybegynder
21. marts 2001 - 19:29 #9
Men fordi du har overskrevet paint() metoden.
Avatar billede james_t_dk Juniormester
21. marts 2001 - 21:30 #10
Ja, men det hjalp jo hverken at placere question i init eller start, jeg har prøvet det.

Hvis du har en løsning der duer, får du points, ellers ikke.
Avatar billede mpultz Nybegynder
22. marts 2001 - 08:39 #11
Helt ok. Jeg er ret sikker på at en timer også ville have løst problemet, men din egen løsning med overskrivning af paint() er mere elegant.
Avatar billede james_t_dk Juniormester
02. april 2001 - 17:11 #12
fik det jo selv til at virke!
Avatar billede mpultz Nybegynder
02. april 2001 - 18:03 #13
Fuldstændig korrekt, jeg kommenterede nu bare din løsning!
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