Avatar billede CipherGuy Novice
04. april 2015 - 12:36 Der er 6 kommentarer og
1 løsning

Repaint af speedometer

Hej.
Jeg har lavet et lille speedometer, jeg gerne vil have til at bevæge sig.

public class Gui extends JFrame {
    //Speedometer var
    public static int speed = 10;
    public static int xcord = (int)(-Math.cos(Math.toRadians(speed*18))*50)+60;
    public static int ycord = (int)(-Math.sin(Math.toRadians(speed*18))*50)+60;

    public static class MyGraphics extends JComponent {
        MyGraphics() {
            setPreferredSize(new Dimension(120, 100));
        }
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.white);
            g.fillArc(10, 10, 100, 100, 0, 180);
       
            g.setColor(Color.black);
            g.drawArc(10, 10, 100, 100, 0, 180);
            g.drawLine(10, 60, 110, 60);
            g.setColor(Color.red);
            g.drawLine(60, 60, xcord, ycord); 
            //g.drawLine(60, 60, 60, 10);
           
            g.setColor(Color.blue);
           
            for(int i=0; i<=10; i++) {
                //i, x, y
                g.drawString(""+i+"",
                (int)((-Math.cos(Math.toRadians(i*18))*40)+55),
                (int)(-Math.sin(Math.toRadians(i*18))*40)+60);
            }
        }
    }

    public void initComponents() { 
        jPanel.add(new MyGraphics());
    }
}

Så er det meningen at jeg skal kunne rette på variablen speed, og derved få nålen på speedometeret til at bevæge sig. Men kan ikke få den til at repainte - nogen forslag?

Håber mit spørgsmål giver mening.
Avatar billede arne_v Ekspert
04. april 2015 - 14:14 #1
Det boer bare vaere at kalde repaint.

Men:
1) paintComponent bruger saa videt jeg kan se ikke speed
2) hvor aendrer du speed henne?
Avatar billede CipherGuy Novice
04. april 2015 - 14:42 #2
Nej, paintComponent bruger ikke speed, men beregner x og y coordinaten for nålen i speedometeret ud fra hastigheden:

public static int xcord = (int)(-Math.cos(Math.toRadians(speed*18))*50)+60;
public static int ycord = (int)(-Math.sin(Math.toRadians(speed*18))*50)+60;

Det er en 180 graders speedometer, som starter i 0km/t og slutter i 10km/t.
Derfor har jeg lavet cos/sin(hastighed*18)*højden på speedometeret.

Det er faktisk meningen at hastigheden bliver målt fra en arduino, som jeg har sat på en fjernstyret bil. Så der kommer en hastighedsmåling fra arduinoen, som speed skal sættes lig med.

Dette er dog ikke lavet endnu, så har bare gjort sådan indtil videre:
    public static void chooseRand() {
        Random r = new Random();
        int Min = 1;
        int Max = 10;
        int R = r.nextInt(Max-Min) + Min;
        Gui.speed = R;
    }
chooseRand bliver kaldt med et delay på et halv sekundt.
Hvis jeg printer speed ændre den sig fint.
Men selv hvis jeg skriver:
  ...
  Gui.speed = R;
  Gui.jPanel.repaint();
}
Sker der ikke noget :)
Avatar billede arne_v Ekspert
04. april 2015 - 14:57 #3
Jeg proever lige at lave et eksempel!
Avatar billede arne_v Ekspert
04. april 2015 - 15:27 #4

package april;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class SpeedometerDemo extends JFrame {
    private static final long serialVersionUID = 1L;
    public static class Speedometer extends JPanel {
        private static final long serialVersionUID = 1L;
        private int dim;
        private double maxspeed;
        private double speed;
        public Speedometer(int dim, int maxspeed) {
            this.dim = dim;
            this.maxspeed = maxspeed;
            speed = 0;
            setPreferredSize(new Dimension(2*dim, dim));
        }
        @Override
        public void paintComponent(Graphics g) {
            int x1 = dim;
            int y1 = dim - 10;
            double a = (maxspeed - speed) / maxspeed * Math.PI;
            int x2 = (int) Math.round(x1 + dim * 0.95 * Math.cos(a));
            int y2 = (int) Math.round(y1 - dim * 0.95 * Math.sin(a));
            g.drawLine(x1, y1, x2, y2);
        }
        public void setSpeed(double speed) {
            this.speed = speed;
            getParent().repaint(); // this.repaint() messes up things
        }
        public void changeSpeed(double speedchange) {
            this.speed += speedchange;
            getParent().repaint(); // this.repaint() messes up things
        }
    }
    private Speedometer speed;
    public SpeedometerDemo() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Speedometer");
        getContentPane().setLayout(new BorderLayout());
        speed = new Speedometer(400, 10);
        getContentPane().add(speed, BorderLayout.CENTER);
        // start simulate how to change speed
        JPanel btns = new JPanel();
        btns.setLayout(new GridLayout(1, 2));
        JButton down = new JButton("-");
        down.addActionListener((evt) -> speed.changeSpeed(-1));
        btns.add(down);
        JButton up = new JButton("+");
        up.addActionListener((evt) -> speed.changeSpeed(1));
        btns.add(up);
        getContentPane().add(btns, BorderLayout.SOUTH);
        // end simulate
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new SpeedometerDemo();
                f.setVisible(true);
            }
        });
    }
}
Avatar billede CipherGuy Novice
04. april 2015 - 18:26 #5
Synes stadig jeg har problemer..
Jeg har en funktion initComponents(), hvor jeg opretter hele mit interface, hvor jeg også tilføjer mit speedometer:
jPanel.add(new MyGraphics());
Men det skal være i en anden funktion hvor changeSpeed() bliver kaldt..
Kan bare ikke få det til at virke...
Avatar billede CipherGuy Novice
04. april 2015 - 19:35 #6
Så fik jeg det til at virke.
Tak for hjælpen! :)
Du må gerne oprette et svar
Avatar billede arne_v Ekspert
05. april 2015 - 02:42 #7
ok
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

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