Avatar billede netsrac Praktikant
28. november 2001 - 16:57 Der er 35 kommentarer og
1 løsning

Gør da snart amok - LostFocus

Det var da utroligt, jeg har et JWindow hvor jeg har prøvet med alverdens listeners men jeg kan bare ikke få vinduet til altid at komme frem i toppen af skærmen, altså hvordan laver jeg så mit JWindow er \"Always on top\" indtil programmet afsluttes ?
Avatar billede soreno Praktikant
28. november 2001 - 17:01 #1
always on top er vist ikke en del af java api\'et.
en mulighed er at bruge jni, men så er dit program jo ikke platformuafhængigt.

JWindow == JFrame?
Avatar billede netsrac Praktikant
28. november 2001 - 17:04 #2
Nej JWindow = JWindow

bruge jni ?
Avatar billede soreno Praktikant
28. november 2001 - 17:05 #3
har du prøvet at aktivere din frame i:
    public void windowDeactivated(WindowEvent e) {}
        public void windowIconified(WindowEvent e) {}

?
Avatar billede netsrac Praktikant
28. november 2001 - 17:17 #4
Ja jeg har haft den WindowListener på og i den sætte den til at kalde .toFront() på mit JWindow, men ligemeget hjælper det ?
Avatar billede erikjacobsen Ekspert
28. november 2001 - 17:32 #5
Hvad med at kalde .toFront() 5 gange i sekundet - i en separat tråd??
(Jeg ved ikke om det virker....)
Avatar billede netsrac Praktikant
28. november 2001 - 17:37 #6
erikjacobsen >> Det er ikke så godt, det giver StackOverflow
Avatar billede erikjacobsen Ekspert
28. november 2001 - 18:36 #7
Ikke hvis man laver det rigtigt ;)
Avatar billede netsrac Praktikant
28. november 2001 - 18:55 #8
Kunne du så ikke fortælle mig hvordan man laver det rigtig ? :)
Avatar billede erikjacobsen Ekspert
28. november 2001 - 19:05 #9
Nix, tror du det er en gavebutik, det her - nå ja, det er det jo næsten.

Men kunne du ikke vise hvad du gør? Måske er 5 gange i sekundet for
meget. Hvis den ikke kan nå at gøre den færdig, håber de hændelser sig
jo op. Prøv evt. lidt færre gange.
Avatar billede erikjacobsen Ekspert
28. november 2001 - 19:06 #10
håber=hober
Avatar billede netsrac Praktikant
28. november 2001 - 19:08 #11
Jeg havde bare lavet det som en rekursiv funktion der kørte hele tiden ?
Avatar billede erikjacobsen Ekspert
28. november 2001 - 19:33 #12
Ok, hvis du ikke har hørt om en while-løkke, skal jeg gerne give
dig et lynkursus - en dag.
Avatar billede netsrac Praktikant
28. november 2001 - 20:03 #13
*Gg* Du er sjov idag hva Erik ?

Lave en while løkke der løber uendeligt eller hvordan ?
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:08 #14
ja, det er da stort set som at høre min svigermor snakke......

i en tråd

    while (not stopped) {
      sleep(200);
    }

og så lave en boolean stopped, man kan sætte hvis man ikke vil mere (f.eks.
vi en setStopped().
Avatar billede netsrac Praktikant
28. november 2001 - 20:22 #15
Jamen du kunne da bare have sagt at der var noget der hed sleep() er jo ikke mester i Java :=)

Som din svigermor ? Hm..

Det går ikke det med at sætte den til at sove, computeren går helt amok og de ActionListeners som er i mit JWindow virker ikke, dvs. alle knapper bliver uklikbare så det er ikke kun mine Listeners.
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:24 #16
Gør du det i en tråd?
Avatar billede netsrac Praktikant
28. november 2001 - 20:28 #17
Definer tråd ? Jeg lavede extends Thread på min klasse og lave så en metode der hed getFocus() som blev kaldt efter load, den indeholdt en while løkke der så sådan her ud:

while (true)
{
  winMain.toFront();
  sleep(2000);
}

selvfølgelig med en try / catch.
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:35 #18
Du skal nok gøre det i en helt anden klasse - ikke din gui-klasse. Du skal
have winMain med som parameter. Det du skal opnå, at der er en tråd, der
udelukkende har til formål at sove - og så en gang imellem  lave en toFront() -
mens resten af dit program cykler derudaf som det plejer.
Avatar billede netsrac Praktikant
28. november 2001 - 20:43 #19
Nu har jeg lavet en klasse sådan her:

import javax.swing.*;

public class FocusControl extends Thread
{
    public FocusControl(JWindow com)
    {
        while (true)
        {
            try
            {
            com.toFront();
            sleep(2000);
            }
            catch(Exception e)
            {
            }
        }
    }
}

også laver jeg en new FocusControl(winMain); i min gui klasse, men computeren går stadig amok, har den engang tabt focus bliver det bare til en hvis kasse på skærmen.
Avatar billede soreno Praktikant
28. november 2001 - 20:47 #20
prøv også at kalde repaint();
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:54 #21
Hvad med at putte kode med whileløkken ned i run()-metoden?
Din constructor bliver jo rent faktisk kørt i din primære tråd
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:54 #22
...og kald ikke repaint --- endnu da. Det burde ikke være nødvendigt.
Avatar billede netsrac Praktikant
28. november 2001 - 20:57 #23
Ja jeg ved ikke lige hvad der skete om det ikke var fordi jeg fik compilet det hele ordentligt eller hvad det var, men nu virker det ihvertfald med den FocusControl, så hvis du lige lægger et svar Erik :)
Avatar billede erikjacobsen Ekspert
28. november 2001 - 20:59 #24
Skitse

  class FocusControl extends Thread {
    JWindow mycom;
    public FocusControl(Jwindow com) {
      mycom=com;
    }
    public void run() {
    while (true)  {
      try {
          mycom.toFront();
          sleep(2000);
      } catch(Exception e)  {
      }
    }
}
}


og så skriver du

  FocusControl f = new FocusControl(winMain);
  f.start()
Avatar billede erikjacobsen Ekspert
28. november 2001 - 21:00 #25
Joh, skal nok. Men bruger du run() ??
Avatar billede netsrac Praktikant
28. november 2001 - 21:01 #26
Nej jeg bruger ikke run, jeg bruger den som skrev, hvad er forskellen ? :)
Avatar billede erikjacobsen Ekspert
28. november 2001 - 21:07 #27
Øh, jo, det virker måske også....men det er rigtigst med min skitse,
altså proppe det ind i en run() og sige start(). Prøv det lige
Avatar billede netsrac Praktikant
28. november 2001 - 21:10 #28
Har lige fundet et nyt problem ved at gøre det på den måde, hvis man har to sidestående vinduer vil det vindue som bruger FocusControl() hele tiden få focus hvilket ikke var meningen, kan man gøre noget ved det ?
Avatar billede erikjacobsen Ekspert
28. november 2001 - 21:36 #29
Det vil ske, ja. Hvis du ved hvilket vindue, du vil have i fokus, må du sætte
mycom variablen i mit eksempel, fx med en setWindow(...) metode.
Avatar billede netsrac Praktikant
28. november 2001 - 21:41 #30
Det hele bunder i at jeg starter med at åbne en JFrame i fuldskærm størrelse herefter åbner jeg JWindows oven på dette for at få programmet til at flyde sammen i et istedet for at bestå af mange små vinduer, det kan være der er en nemmere måde at gøre det på, udover at skrive det hele i en klasse og vise og skjule paneler efter behov.
Avatar billede erikjacobsen Ekspert
28. november 2001 - 22:00 #31
Øhh, den fik jeg ikke helt styr på. Prøver du at efterligne windows MDI
(multiple document interface)?
Avatar billede netsrac Praktikant
28. november 2001 - 22:04 #32
Jo med JWindow ser det jo ikke ud som et rigtigt vindue, det flyder ligesom på skærmen, så ved at have en fuldskærm bagved giver det et pænt layout. Mit program består af mange dele som indtil videre vises som en masse vinduer på skærmen, det ville jeg gerne have lavet så det ser ud som ét program.
Avatar billede erikjacobsen Ekspert
28. november 2001 - 22:18 #33
Hmm, jeg er ikke sikker på jeg kan hjælpe dig til en løsning på det - men man
burde kunne programmere det,  så du kan simulere en MDI. Men jeg ved nok
ikke tilstrækkeligt om det.
Avatar billede netsrac Praktikant
28. november 2001 - 22:21 #34
Nå men det er der så ikke noget at gøre ved, det må jeg jo prøve at lege med i juleferien, nu må jeg nok hellere komme videre med det eksammens projekt her, vinduer eller ej :)

Smider lige lidt point :)
Avatar billede erikjacobsen Ekspert
28. november 2001 - 22:42 #35
Jeg kan lige trøste dig med, at jeg ikke skal være censor i Esbjerg til januar :))
Avatar billede netsrac Praktikant
28. november 2001 - 23:35 #36
øv, det kunne være sjovt nok at have dig til censor :)
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