Avatar billede r.hegaard Nybegynder
22. oktober 2004 - 15:59 Der er 9 kommentarer og
1 løsning

Flytte komponenter på JFrame langsomt

Jeg har nogle forskellige komponenter på en JFrame, som jeg gerne vil have til af flytte sig langsomt, når jeg klikker på en knap.
Jeg har prøvet at køre et loop, som for hver gennemkøring holder en lille pause med Thread.sleep(). Det virker desværre ikke, da det alligevel rykker på engang efter hele loopet er gennemkørt.
Hvad kan jeg gøre, for at få det til at flytte sig langsomt ??
Avatar billede _carsten Nybegynder
22. oktober 2004 - 16:12 #1
Prøv i den loop at kalde validate(); på din frame
Avatar billede _carsten Nybegynder
22. oktober 2004 - 16:12 #2
Altså:      minFrame.validate();
Avatar billede r.hegaard Nybegynder
22. oktober 2004 - 16:43 #3
Det gør ingen forskel.
Avatar billede _carsten Nybegynder
22. oktober 2004 - 16:56 #4
Prøv dette eksempel.

public class MyFrame extends javax.swing.JFrame {
    Thread t;
    boolean stop = false;
   
    public MyFrame() {
        initComponents();
        setSize(400,300);
       
        t = new Thread(){
                public void run(){
                    while(!stop){
                        int x = 50;
                        int y = 60;

                        for(int i = 0; i < 300; i++ ){
                            jButton1.setLocation(x + i,y);
                            try{
                                if(stop == true)
                                    return;
                                sleep(102 - jSlider1.getValue());
                            }
                            catch (InterruptedException s){}
                                }
                            }
                }
        };
        t.start();
    }
   
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        stopBtn = new javax.swing.JButton();
        jSlider1 = new javax.swing.JSlider();
        jLabel1 = new javax.swing.JLabel();

        getContentPane().setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        getContentPane().add(jButton1);
        jButton1.setBounds(20, 80, 100, 23);

        stopBtn.setText("Stop");
        stopBtn.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancel(evt);
            }
        });

        getContentPane().add(stopBtn);
        stopBtn.setBounds(10, 20, 100, 23);

        jSlider1.setMinorTickSpacing(10);
        jSlider1.setPaintLabels(true);
        jSlider1.setPaintTicks(true);
        jSlider1.setSnapToTicks(true);
        jSlider1.setValue(25);
        getContentPane().add(jSlider1);
        jSlider1.setBounds(140, 20, 200, 33);

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Hastighed");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(150, 0, 180, 14);

        pack();
    }

    private void cancel(java.awt.event.ActionEvent evt) {
        stop = true;
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MyFrame().setVisible(true);
            }
        });
    }
   
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JSlider jSlider1;
    private javax.swing.JButton stopBtn;   
}
Avatar billede r.hegaard Nybegynder
22. oktober 2004 - 19:39 #5
Ja, det virker. Er det koden i main metoden, som gør at det virker ?? Hvad gør den ??

Hvordan kan jeg få det til at virke i denne kode:
public class Win
{
    private static javax.swing.JFrame  myWindow;
    private static javax.swing.JButton jBut1;
    private static javax.swing.JButton jBut2;

    public static void kWindow()
    {
        myWindow = new javax.swing.JFrame();myWindow.setSize(600,200);
        myWindow.getContentPane().setLayout(null);
        jBut1 = new javax.swing.JButton("Klik her");
        jBut2 = new javax.swing.JButton("jBut2");
        jBut1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {go();}
        });
        myWindow.getContentPane().add(jBut1);jBut1.setBounds(0, 0,100,50);
        myWindow.getContentPane().add(jBut2);jBut2.setBounds(0,50,100,50);
        myWindow.setVisible(true);
    }
   
    public static void go()
    {
        for (int i = 0;i<15;i++){
            jBut2.setLocation(i*15,50);
            try{Thread.sleep(100);} catch (InterruptedException s){}
        }
    }
}
Avatar billede _carsten Nybegynder
22. oktober 2004 - 20:16 #6
Nej, det er ikke derfor.

Min applikation (MyFrame) kører i sin egen tråd, jeg starter så yderligere en tråd som jeg bruger til at flytte knappen med, denne tråd lader jeg så holde pause ind i mellem alt afhængig af hvor JSlideren står

Din applikation starter også i sin egen tråd, (deamon tråden, hovedtråden), men da du bruger Thread.sleep, så er det hovedtråden du stopper og dermed stopper du afviklingen af din applikation. I mit eksempel stoppes afviklingen af applikationen aldrig, kun den tråd som flytter knappen

Arne V. har skrevet en artikel om tråde i Java, jeg har svært ved at tro den ikke skulle være 5 point værd (har dog ikke selv læst den) men er sikker på du kan få god hjælp i den:  http://www.eksperten.dk/artikler/27

Ellers er der også noget her:
http://java.sun.com/developer/Books/javaprogramming/threads/chap9.pdf

Og selfølgelig den officielle:
http://java.sun.com/docs/books/tutorial/essential/threads/index.html
Avatar billede _carsten Nybegynder
22. oktober 2004 - 20:22 #7
Mht. hvordan du implementerer det i din kode, ja - så er det næsten copy/paste

    private static Thread t;

    public static void kWindow() {
        t = new Thread(){
                public void run(){
                    while(!stop){
                        int x = 50;
                        int y = 60;

                        for(int i = 0; i < 300; i++ ){
                            jBut2.setLocation(x + i,y);
                            try{
                                if(stop == true)
                                    return;
                                sleep(102 - jSlider1.getValue());
                            }
                            catch (InterruptedException s){}
                                }
                            }
                }
        };

        jBut1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
              t.start();
            }
        });
Avatar billede _carsten Nybegynder
22. oktober 2004 - 20:30 #8
Du kan jo også implementere det i din go()

    public static void go()
    {
        t = new Thread(){
                public void run(){
                      for (int i = 0;i<15;i++){
                        jBut2.setLocation(i*15,50);
                          try{ t.sleep(100);} catch (InterruptedException s){}
                      }
                }
        };
        t.start();
        jBut1.setEnabled(false);
    }
Avatar billede r.hegaard Nybegynder
22. oktober 2004 - 21:22 #9
Tak for det.
Jeg prøver mig lige lidt frem med det og så vender jeg tilbage....
Avatar billede r.hegaard Nybegynder
27. oktober 2004 - 20:24 #10
Jeg har fået det til at virke, som det skal. Tak for hjælpen...
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