- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一个小java应用程序。有一个带有 3 个 slider 的 GUI。它们显示了 arduino 传感器的 3 个加速度值。但一切也应该离线工作(使用文件中的值)。
File is looking like this:
10 10 10
11 12 12
15 11 11
...
如果我使用菜单并决定“从文件读取”, Action 监听器将启动 ReadFromFile...我选择的文件将被逐行读取。系统输出工作正常。 slider 应该像 3 个 Activity 光束一样移动,但事实并非如此。
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]);
}
最佳答案
好的,在你的 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) 并且这搞乱了 swing 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();
}
关于JAVA jslider 的 setValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34662513/
我正在为 Mac OS X 编写程序,遇到以下问题: 在我的一个类中,有许多 bool 属性,可以使用 KVO 访问这些属性(即通过 valueForKey: 和 setValue:forKey: 方
我正在创建一个带有页面对象文件 (login.po.js) 和测试规范文件 (test.spec.js) 的 webdriver.io 自动化,但是当我调用它时它似乎无法识别该对象测试规范文件 (te
我正在尝试使用 setValue() 方法将数据保存到我的实时数据库,但它没有保存我的对象。 我尝试了一个简单的字符串,但仍然没有成功。 我的代码: FirebaseDatabase db =
我一直在谷歌应用程序脚本上为工作表编码: function basePesa(){ var sheet = SpreadsheetApp.getActiveSpreadsheet().getSh
FinalViewWithSending *newView = [[FinalViewWithSending alloc]initWithNibName:@"FinalViewWithSending"
我创建了一个自动完成和一个选项组件,当我们在输入字段中键入搜索短语时,我调用网络服务并获取数据,然后在选项组件中显示列表,但是当我从该列表中选择一个选项并将值设置为输入字段,然后 Web 服务将再次触
电子表格的 Google-apps 脚本 我有一个可变长度的对象数组。 [{}, {}]我使用 for 循环 (i=0; i
我有以下带有MutableLiveData data的ViewModel和另一个从ones派生的LiveData data,其方式是仅当data.number等于1时才更新其值。 class Dumm
我在 Mac OS X 10.6.8、wxPython 2.9.3.1 和 64 位 Python v2.7.2 下运行以下代码: import wx class MyFrame(wx.Frame):
我会在他注册时将用户数据保存到 firebase,但是有一个问题,如果他创建了 Auth 帐户然后在保存他的信息之前失去了连接,这意味着他将得到没有任何个人资料信息的电子邮件\密码。 所以问题是如果他
我创建了一个自动完成和一个选项组件,当我们在输入字段中键入搜索短语时,我调用网络服务并获取数据,然后在选项组件中显示列表,但是当我从该列表中选择一个选项并将值设置为输入字段,然后 Web 服务将再次触
我们目前有一个按钮,第一次按下时会添加一个节点,如下/Users/UID/Interests/childByAutoID/"value",再次按下时会删除该节点上的值。第一次单击按钮时,值将添加到节点
我在使用 Swift 编写的 iOS 应用程序中使用 Firebase。 static func createUserRecord(uid: String, user: User){
大家好,我是 swift 的新手,在我的应用程序中,我声明了一个这样的字典: var imageDict : Dictionary = [:] 我想像这样为该字典设置值: imageDict.setV
我已经使用代码创建了RadioGroup var radios = new Ext.form.RadioGroup({ columns : 2, items: [
这个问题已经有答案了: Xcode - How to fix 'NSUnknownKeyException', Reason: "… this class is not key value codin
如何使用 RTTI 设置枚举字段的值? 即 type TCPIFileStatus= (fsUnknown, fsProcessed); TTest = class FStatus:
我帮助维护一个 Google 电子表格,其中通过 HTML 表单添加新数据。 添加新数据时,新数据的插入点取决于表单字段之一(申请接收日期)。 该脚本查找工作表中应插入数据的位置并执行 3 件事: 在
我正在编写的程序使用许多注册表项来存储一些重要信息。为了确保程序的第一个方法中存在所有注册表项,我测试注册表项是否存在,如果不存在则创建它们并使用默认值。 这是我的代码: RegistryKey R
我正在学习 Extjs 并遇到问题,当我尝试将新文本附加到项目时,我收到错误 tf.setValue 不是函数 getValue 也是如此。当我尝试 setVisible 时,它的工作原理应该是这
我是一名优秀的程序员,十分优秀!