JAVA setValue jslider

Я написал небольшое Java-приложение. Есть графический интерфейс с 3 ползунками. Они показывают 3 значения ускорения ардуино-сенсора. Но все должно работать и в автономном режиме (со значениями из файла).

File is looking like this:
10    10    10
11    12    12
15    11    11
...

Если я воспользуюсь своим меню и решу «Читать из файла», прослушиватель действий запустит ReadFromFile... мой выбранный файл будет прочитан построчно. System.out работает корректно. Ползунки должны двигаться как 3 активных луча, но этого не произошло.

public void ReadFromFile(File file) {

System.out.print("\n Datei= " + file);

if(file.exists()){
        try {
        Scanner scn = new Scanner(file);
            while(scn.hasNextLine()){

                try {               

        System.out.print("\n x= " + Integer.parseInt(scn.next()));
        System.out.print("\n y= " + Integer.parseInt(scn.next()));
        System.out.print("\n z= " + Integer.parseInt(scn.next()));


        x_slider.setValue(Integer.parseInt(scn.next()));
        y_slider.setValue(Integer.parseInt(scn.next()));
        z_slider.setValue(Integer.parseInt(scn.next()));

        Thread.sleep(500);                                  

                } catch (InterruptedException e) {}


            }
            scn.close();
        } 
        catch (FileNotFoundException e) {e.printStackTrace();}
    }
}

весь код класса

    import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JSlider;
import com.fazecast.jSerialComm.*;

public class AccelerometerGUI extends Frame implements ActionListener{

private static final long serialVersionUID = 1L;

PortInitial portselect;
Kalibrieren cali;
static SerialPort chosenport = null;

static int[] werte = {0, 0, 0};                     // format x_wert, y_wert, z_wert
static int[] minmax = {0, 0, 0, 1024, 1024, 1024};  // format x_min, y_min, z_min, x_max, y_max, z_max

Scanner s = new Scanner(System.in);

Component aComponent;

JSlider x_slider = new JSlider();
JSlider y_slider = new JSlider();
JSlider z_slider = new JSlider();

public static void main (String[] args)
{
    @SuppressWarnings("unused")

    AccelerometerGUI GUI = new AccelerometerGUI();  
}   

public AccelerometerGUI () {

    JFrame window = new JFrame("Accelerometer GUI");            // Fenster mit Namen erstellen
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    MenuBar DasMenu = new MenuBar();                            // Menü erstellen
    window.setMenuBar(DasMenu);

    Menu File = new Menu("Datei");                              // Menüpunkt Datei
    DasMenu.add(File);

    Menu Settings = new Menu("Einstellungen");                  // Menüpunkt Einstellungen
    DasMenu.add(Settings);      

    MenuItem Start = new MenuItem("Start");                     // Unter-Menüpunkt Start
    Start.addActionListener(this);
    File.add(Start);

    MenuItem WriteFile = new MenuItem("In Datei schreiben");    // Unter-Menüpunkt In Datei schreiben
    WriteFile.addActionListener(this);
    File.add(WriteFile);

    MenuItem ReadFile = new MenuItem("Aus Datei lesen");        // Unter-Menüpunkt Aus Datei lesen
    ReadFile.addActionListener(this);
    File.add(ReadFile);

    MenuItem Exit = new MenuItem("Beenden");                    // Unter-Menüpunkt Beenden
    Exit.addActionListener(this);
    File.add(Exit);

    MenuItem Sensorkali = new MenuItem("Sensor kalibrieren");   // Unter-Menüpunkt Sensor kalibrieren
    Sensorkali.addActionListener(this);
    Settings.add(Sensorkali);   

    Panel sliderpanel = new Panel();                            // Panel für Slider erstellen
    sliderpanel.setLayout(new GridLayout(3,1));

    x_slider.setEnabled(true);                                  
    x_slider.setMajorTickSpacing(100);
    x_slider.setMinorTickSpacing(10);
    x_slider.setPaintTicks(true);
    x_slider.setPaintLabels(true);

    y_slider.setEnabled(true);                                  
    y_slider.setMajorTickSpacing(100);
    y_slider.setMinorTickSpacing(10);
    y_slider.setPaintTicks(true);
    y_slider.setPaintLabels(true);

    z_slider.setEnabled(true);                                  
    z_slider.setMajorTickSpacing(100);
    z_slider.setMinorTickSpacing(10);
    z_slider.setPaintTicks(true);
    z_slider.setPaintLabels(true);

    // Sliderpanel bestücken

    sliderpanel.add(x_slider);                                  
    sliderpanel.add(y_slider);
    sliderpanel.add(z_slider);

    sliderpanel.setPreferredSize(new Dimension(500, 200));

    window.setLayout(new GridLayout(1,1));                      // Fenster-Layout erstellen
    window.add(sliderpanel);

    window.pack();
    window.setVisible(true);        

    SetSliderMinMax();

    //SelectPort();

    //ReadData();
}       

public void actionPerformed(ActionEvent e) {

    String Befehl = e.getActionCommand();

    /*      MenüPunkt-Start            */

    if(Befehl.equals("Start")){
        if(chosenport != null){                                 // Prüfung ob Port bereits ausgewählt
            System.out.println("Startet");
            SetSliderMinMax();
            ReadData();
        }
        else{
            NoPortSelected();                                   // Aufforderung Port auswählen
        }
    }

    /*      MenüPunkt-In Datei schreiben   */

    if(Befehl.equals("In Datei schreiben")){

        if(chosenport != null){                                 // Prüfung ob Port bereits ausgewählt
            System.out.println("In Datei schreiben");

            //Create a file chooser
            final JFileChooser fc = new JFileChooser();
            //In response to a button click:
            int returnVal = fc.showOpenDialog(aComponent);

            System.out.println(aComponent);
            System.out.println(returnVal);

             if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    //This is where a real application would open the file.
                    System.out.println("Opening: " + file.getName());

                    WriteToFile(file);

             } else {
                    System.out.println("Open command cancelled by user.");
             }
        }
        else{
            NoPortSelected();                                   // Aufforderung Port auswählen
        }
    }

    /*      MenüPunkt-Aus Datei lesen  */

    if(Befehl.equals("Aus Datei lesen")){

        System.out.println("Aus Datei lesen");

        //Create a file chooser
        final JFileChooser fc = new JFileChooser();
        //In response to a button click:
        int returnVal = fc.showOpenDialog(aComponent);

        System.out.println(aComponent);
        System.out.println(returnVal);

         if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                //This is where a real application would open the file.
                System.out.println("Opening: " + file.getName());

                ReadFromFile(file);

         } else {
                System.out.println("Open command cancelled by user.");
         }
    }

    /*      MenüPunkt-Beenden      */

    if(Befehl.equals("Beenden")){
        System.out.println("Anwendung beendet");
        System.exit(0);
    }

    /*      MenüPunkt-Sensor kalibrieren       */

    if(Befehl.equals("Sensor kalibrieren")){

        System.out.println("Sensor kalibrieren");

        if(portselect != null)                              // Prüfung ob Port bereits ausgewählt wurde
        {
            if (cali == null){
                cali = new Kalibrieren(this, "Sensor kalibrieren");
                }
            cali.setVisible(true);

            System.out.println("Kalibrierte Werte: " + minmax[0] + " " + minmax[1] + " " + minmax[2] + " " + minmax[3] + " " + minmax[4] + " " + minmax[5]);

            SetSliderMinMax();                              // Slider MinMAx auf kalibrierte Werte aktualisieren
        }
        else{                                               // Es wurde noch kein Port ausgewählt - Warnung
            NoPortSelected();
        }   
    }
}


void SelectPort(){      portselect = new PortInitial(this, "Port wählen");
portselect.setVisible(true);
if (portselect.getResult()) 
{
    chosenport = portselect.getThePort();

    System.out.println("Ausgewählter Port: "+ chosenport.getSystemPortName()); 
}
else {
    System.out.println("Port auswählen abgebrochen");
    }
}


/*      Methode: SetSliderMinMax() setzt das Minimum und Maximum der Slider     */

void SetSliderMinMax() {

    x_slider.setMinimum(minmax[0]);
    y_slider.setMinimum(minmax[1]);
    z_slider.setMinimum(minmax[2]);     
    x_slider.setMaximum(minmax[3]);
    y_slider.setMaximum(minmax[4]);
    z_slider.setMaximum(minmax[5]); 
}

/*      Methode: WriteToFile() Legt Werte in Datei ab       */

public void WriteToFile(File file) {
    if(file.exists()){
        try {
        Scanner scn = new Scanner(file);
            while(scn.hasNextLine()){

                try {               
                    werte[0] = Integer.parseInt(scn.next());
                    werte[1] = Integer.parseInt(scn.next());
                    werte[2] = Integer.parseInt(scn.next());
                    Thread.sleep(500);                                  // Wartezeit 500 Millisekunden

                } catch (InterruptedException e) {}

                Showdata();

            }
            scn.close();
        } 
        catch (FileNotFoundException e) {e.printStackTrace();}
    }
}

/*      Methode: ReadFromFile() legt Werte-Input auf Datei      */

public void ReadFromFile(File file) {

    System.out.print("\n Datei= " + file);

    if(file.exists()){
        try {
        Scanner scn = new Scanner(file);
            while(scn.hasNextLine()){

                try {               

                    String x = scn.next();
                    String y = scn.next();
                    String z = scn.next();
                    System.out.print("\n x= " + Integer.parseInt(x));
                    System.out.print("\t y= " + Integer.parseInt(y));
                    System.out.print("\t z= " + Integer.parseInt(z));


                    x_slider.setValue(Integer.parseInt(x));
                    y_slider.setValue(Integer.parseInt(y));
                    z_slider.setValue(Integer.parseInt(z));

                    System.out.print("\n X= " + x_slider.getValue());
                    System.out.print("\t Y= " + y_slider.getValue());
                    System.out.print("\t Z= " + z_slider.getValue());

                    Thread.sleep(500);                                  // Wartezeit 500 Millisekunden

                } catch (InterruptedException e) {}
                /*
                System.out.print("\n x= " + werte[0]);
                System.out.print("\t y= " + werte[1]);
                System.out.print("\t z= " + werte[2]);              

                x_slider.setValue(werte[0]);
                y_slider.setValue(werte[1]);
                z_slider.setValue(werte[2]);


                */
                //Showdata();

            }
            scn.close();
        } 
        catch (FileNotFoundException e) {e.printStackTrace();}
    }
}

/*      Methode: ReadData() öffnet Port und liest Werte ein und stellt diese dar       */

public void ReadData() {

    chosenport = portselect.getThePort();

    if(chosenport.openPort()){
        System.out.println("Port erfolgreich geöffnet");
        chosenport.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);

        Scanner data = new Scanner(chosenport.getInputStream());

        while(data.hasNextLine()){
                try {
                    werte[0] = Integer.parseInt(data.next());
                    werte[1] = Integer.parseInt(data.next());
                    werte[2] = Integer.parseInt(data.next());   

                } catch(Exception ee){}

                Showdata();
            }
        s.close();
        data.close();
    }
    else {
        PortSelectFail();
    }   
}

/*      Methode: NoPortSelected() zeigt Popup mit Aufforderung Port zu wählen      */

void NoPortSelected() {
    JFrame alert = new JFrame();
    JOptionPane.showMessageDialog(alert,"Es ist kein Port ausgewählt\n\nTipp: Settings > Port einstellen\n", "Warnung", JOptionPane.WARNING_MESSAGE);      
}

/*      Methode: PortSelectFail() zeigt Popup mit erneuten Aufforderung Port zu wählen     */

static void PortSelectFail() {
    JFrame alert = new JFrame();
    JOptionPane.showMessageDialog(alert,"Port öffnen fehlgeschlagen\n\nTipp: Überprüfen Sie den Port und versuchen Sie es erneut\n", "Warnung", JOptionPane.WARNING_MESSAGE);        
}

/*      Methode: Showdata() Werte werden auf Slider und Konsole dargestellt     */

public void Showdata() {

    x_slider.setValue(werte[0]);
    y_slider.setValue(werte[1]);
    z_slider.setValue(werte[2]);
}

person Flo    schedule 07.01.2016    source источник
comment
Я обновил ответ, вы не можете использовать Thread.sleep с кодом Swing, вам нужно использовать таймер   -  person JRowan    schedule 08.01.2016


Ответы (1)


ок под ваши JSliders поставь этот таймер и вот такие вот арралисты

JSlider x_slider = new JSlider();
JSlider y_slider = new JSlider();
JSlider z_slider = new JSlider();

Timer timer;
ArrayList<String> xs = new ArrayList<String>();
ArrayList<String> ys = new ArrayList<String>();
ArrayList<String> zs = new ArrayList<String>();

тогда для вашего метода сделайте это так, причина в том, что вы использовали Thread.sleep(500) и это испортило Jframe качания, вам нужно использовать таймер

public void ReadFromFile(File file) {

    System.out.print("\n Datei= " + file);

    if(file.exists()){
        try {
        final Scanner scn = new Scanner(file);
            while(scn.hasNextLine()){
                String x = scn.next();
                String y = scn.next();
                String z = scn.next();
                 xs.add(x);
                 ys.add(y);
                 zs.add(z);

            }
            scn.close();
        } 
        catch (FileNotFoundException e) {e.printStackTrace();}
    }
    timer = new Timer(500, new ActionListener(){
        int c = 0;
        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub
            //System.out.print("\n x= " + Integer.parseInt(x));
           // System.out.print("\t y= " + Integer.parseInt(y));
           // System.out.print("\t z= " + Integer.parseInt(z));


            x_slider.setValue(Integer.parseInt(xs.get(c)));
            y_slider.setValue(Integer.parseInt(ys.get(c)));
            z_slider.setValue(Integer.parseInt(zs.get(c)));
            c++;
            if(c == xs.size()){
                timer.stop();
            }
        }

    });
    timer.start();
}
person JRowan    schedule 07.01.2016
comment
Спасибо за вашу помощь. Когда я использую System.out.print(\n X= + x_slider.getValue()); Я вижу правильное значение, но ползунок по-прежнему не двигается. Есть ли функция обновления? - person Flo; 08.01.2016
comment
Может быть, это что-то еще, вы можете выложить весь код? - person JRowan; 08.01.2016
comment
Я получаю сообщение об ошибке: Исключение в потоке AWT-EventQueue-0 java.util.NoSuchElementException. Консоль показывает правильный файл... файл существует... но потом попробовать - поймать ошибку? - person Flo; 09.01.2016
comment
Я создал новый файл меньшего размера, и он отлично работает... большое спасибо - person Flo; 09.01.2016