2016-01-07 22 views
1

我寫了一個小小的Java應用程序。有一個帶3個滑塊的GUI。他們顯示了Arduino傳感器的3個加速度值。但是,一切都應該脫機工作(數值不在文件中)。JAVA jslider的setValue

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

如果我使用我的菜單,並決定ActionListener的「從文件讀取」將啓動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();} 
    } 
} 

該類下的JSliders

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]); 
} 
+0

我更新了答案,你不能使用Thread.sleep和Swing代碼,你必須使用定時器 – JRowan

回答

0

確定整個代碼把這個計時器和這些的ArrayList像這樣

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(); 
} 
+0

thx來幫助你。當我使用System.out.print(「\ n X =」+ x_slider.getValue());我看到正確的價值,但滑塊仍然沒有做出任何舉動。有刷新功能嗎? – Flo

+0

也許它的東西你可以把你的整個代碼? – JRowan

+0

我更新了工作代碼 – JRowan