Was übersehe ich hier? Oder gibt es eine andere Möglichkeit dafür?
private List<Double> getLinePrices( ) {
List<Double> list = new ArrayList<>();
Object lock = new Object();
while (true) {
JSlider s1 = new JSlider(-50, +50, 0);
JFormattedTextField t1 = new JFormattedTextField(123.0);
JFormattedTextField t2 = new JFormattedTextField(0.0);
JFrame f1 = new JFrame();
f1.setLayout(new GridLayout(3, 1));
f1.add(s1);
f1.add(t1);
f1.add(t2);
f1.pack();
f1.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
f1.setVisible(true);
Thread t = new Thread() {
@Override
public void run() {
synchronized (lock) {
while (f1.isVisible()) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Working now");
}
}
};
t.start();
f1.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
synchronized (lock) {
f1.setVisible(false);
lock.notify();
}
}
});
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
double d1 = (double) t1.getValue();
f1.dispose();
list.add(d1);
if (d1 == d1) { // temporär
break;
}
}
return list;
}
(Den Slider muss ich noch verdrahten.)
Es wird nichts angezeigt. getLinePrices rufe ich innerhalb eines ActionListeners/EDT auf, liegt es vielleicht daran? Workaround?
Es wäre wirklich begrüßenswert, wenn uns nicht mit diesem Müll belästigen würdest. Swing kann so schön sein. Was du daraus machst, ist traurig. Aber… um zumindest noch Konstruktivität zu heucheln: Vermutlich suchst du einen (modalen) JDialog.
Nein, nicht direkt. Modal würde den Rest der Anwendung sperren, das Warten auf den modalen Dialog wäre aber in ähnlicher Weise unübersichtlich.
Es geht mir auch nicht darum, Swing anzuprangern, das steht mir gar nicht zu. Ich suche hier einfach nur nach einer eleganten Möglichkeit für das beschriebene Problem.
Ich möchte in einen Graphen beliebig viele Linien einzeichnen können. Zum Beispiel bei 1.5, 1.45 und 1.55.
Dafür möchte ich ein Fenster haben, um die Werte eingeben zu können. Ich möchte also beliebig viele double Werte eingeben können. Die Werte sollen auch über einen „Schieberegler“ eingegeben werden können.
Das UI muss aber auf diese Eingaben warten, ehe sie die Linien einzeichnen kann (logisch).
Also gibt es einen „Enter Data…“ button, der einen Dialog aufmacht, in dem der Regler ist, und wenn man den Dialog mit „OK“ beendet, wird der Wert übernommen, und bei „Cancel“ wird er nicht übernommen. So war sowas schon immer, und da gibt’s Mechanismen dafür. Ohne volatile. Sonst noch was?
Hättest du zu private static boolean yield = false; noch eine Idee?
Sinn un Zweck: Zu einem Wert (hier 123.0) soll ein prozentualer Anteil (von -5 bis +5%) eingegeben werden können. Und die Werte sollen sofort sichtbar sein.
„Guck mal, hier ist ganz viel zusammengeklöppelter code, mach’ den mal besser“. Nein. Stell eine passende Frage, aber richtig, und beschränk’ dich auf das Problem. Was auch immer du da mit dem yield zusammengepfuscht hast, es hat ja nichts mehr mit der Eingabe zu tun (die im Endeffekt mit einer Zeile erledigt war, auf die ich dich schon vorher hingewiesen hatte). Mann-oh-mann…
Doch, es gibt drei Möglichkeiten für die Eingabe und eine „Dreiecksbeziehung“: Wenn ich einen der drei Werte ändere, sollen sich auch die anderen beiden ändern, jedoch nicht der gerade geänderte Wert. (Ich weiß leider nicht genau, es besser zu beschreiben).
Aber ich verstehe die Verhaltensweise des EDTs noch nicht ganz. Ich rufe ja jede Änderung mit invokeLater auf. Eigentlich müsste dann doch „unmittelbar“ „währenddessen“ der DocumentListener der anderen Textfelder aufgerufen werden und es käme zu wechselseitigen Aktualisierungen. Aber anscheinend ist das nicht so. Kannst du mir vielleicht kurz erklären, warum/wie das funktioniert… und ob es immer funktioniert? Danke. Dann wäre das Thema auch schon beendet.
Ein anderes Thema wollte ich nicht aufmachen, weil ich denke, alles hängt hier i-wie miteinander zusammen.
Ich ändere mal meinen Kommunikationsstil. Ich fühle mich mit meiner Frage gerade ein bisschen so (und das entnehme ich deiner Reaktion…), als ob ich etwas falsch gemacht hätte. Aber vielleicht ist das ja nur ein falscher subjektiver Eindruck von mir.
Ich weiß nicht genau, wie oft ich es noch wiederholen muss oder werde, aber du postest irgendwelchen Code, der in so vieler Hinsicht schlecht ist, dass ich für die Kritikpukte eine Stichpunktliste erstellen müßte, (… hey, Moment mal, das hab’ ich doch schon ein paarmal! … wie auch immer … ) und stellst nicht mal eine direkte Frage, sondern nur irgendwelches vages Gelaber, und erwartest, dass jemand deinen Murx liest, deine Ziele errät, erahnt, was die Frage ist, und ~„eine Lösung postet“. Ich könnte jetzt andeuten, welchen „Verlauf“ ich bei diesem Thread eigentlich erwarten würde (…hey, Moment mal, das hab’ ich doch schon ein paarmal! … wie auch immer), aber ich weiß, dass es nichts bringen wird.