Pinoccio
2010-01-28, 18:44:51
Hallo,
einige zur Interaktion gedachten Oberflächenelemente in JAVA, wie z.B. (J)Buttons, sind bei Auswahl über die Tastatur hervorgehoben, wenn sie gerade den Focus haben.
Nun verwende ich auch JSlider. Bislang habe ich leider keine (elegante*) Möglichkeit gefunden auch bei diesen ein solches Verhalten zu bekommen.
Mein Beispiel
Der JButton links hat den Focus, erkennbar an der Umrahmung des Textes. Er könnte nun bspw. per Leertaste gedürckt werden.
http://www.abload.de/img/sl54tt.gif (http://www.abload.de/image.php?img=sl54tt.gif)
Der obere JSlider hat den Focus. Per Pfeiltasten ist er nun bedienbar. Leider ist dies aber nicht erkennbar, insbesondere sieht man (ohne es auszuprobieren) nicht, ob und ggfs. welcher JSlider aktiv ist.
http://www.abload.de/img/sl2536i.gif (http://www.abload.de/image.php?img=sl2536i.gif)
Was kann ich da tun?
Sollte out-of-the-Box laufen.
import java.awt.FlowLayout;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TestingSliders extends JFrame implements ChangeListener,
WindowListener {
JLabel value1;
JLabel value2;
JSlider sl1;
JSlider sl2;
JButton b1;
JButton b2;
public static void main(String[] argv) {
TestingSliders ts = new TestingSliders();
ts.inti();
ts.setSize(300, 300);
ts.setVisible(true);
ts.addWindowListener(ts);
}
public void inti() {
sl1 = new JSlider(JSlider.HORIZONTAL, 0, 10, 5);
sl2 = new JSlider(JSlider.HORIZONTAL, 0, 10, 5);
sl1.addChangeListener(this);
sl2.addChangeListener(this);
sl1.setMajorTickSpacing(10);
sl1.setMinorTickSpacing(1);
sl1.setPaintTicks(true);
sl1.setPaintLabels(true);
sl2.setMajorTickSpacing(10);
sl2.setMinorTickSpacing(1);
sl2.setPaintTicks(true);
sl2.setPaintLabels(true);
value1 = new JLabel("Value 1: 5");
value2 = new JLabel("Value 2: 5");
Hashtable<Integer,JLabel> labelTable1 = new Hashtable<Integer,JLabel>();
labelTable1.put(new Integer(0), new JLabel(""+0));
labelTable1.put(new Integer(5), value1);
labelTable1.put(new Integer(10), new JLabel(""+10));
sl1.setLabelTable(labelTable1);
Hashtable<Integer,JLabel> labelTable2 = new Hashtable<Integer,JLabel>();
labelTable2.put(new Integer(0), new JLabel(""+0));
labelTable2.put(new Integer(5), value2);
labelTable2.put(new Integer(10), new JLabel(""+10));
sl2.setLabelTable(labelTable2);
sl1.setPaintLabels(true);
sl2.setPaintLabels(true);
b1 = new JButton("Out of work - but selectable");
b2 = new JButton("dito");
this.setLayout(new FlowLayout());
this.add(sl1);
this.add(sl2);
this.add(b1);
this.add(b2);
}
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
if (!source.getValueIsAdjusting()) {
if (source.equals(sl1)) {
value1.setText("Value 1: " + source.getValue());
}
if (source.equals(sl2)) {
value2.setText("Value 2: " + source.getValue());
}
}
}
public void windowActivated(WindowEvent arg0) { }
public void windowClosed(WindowEvent arg0) {
this.dispose();
System.exit(0);
}
public void windowClosing(WindowEvent arg0) {
this.dispose();
System.exit(0);
}
public void windowDeactivated(WindowEvent arg0) {}
public void windowDeiconified(WindowEvent arg0) {}
public void windowIconified(WindowEvent arg0) {}
public void windowOpened(WindowEvent arg0) {}
}
*Unelegant wäre wohl per FocusListener zu checken, wer dran ist und dann diesen hervorzuheben, z.B. durch die Textfarbe. Angesichts der einfachheit bei Buttons fände ich das aber ziemlich viel Aufwand.
Kommentare bzgl. der alllgemeinen Unzulänglichkeit von Swing, JAVA allgemein oder sonstige Flames lese ich - aber sie helfen mir hier nicht weiter. ;-)
mfg
einige zur Interaktion gedachten Oberflächenelemente in JAVA, wie z.B. (J)Buttons, sind bei Auswahl über die Tastatur hervorgehoben, wenn sie gerade den Focus haben.
Nun verwende ich auch JSlider. Bislang habe ich leider keine (elegante*) Möglichkeit gefunden auch bei diesen ein solches Verhalten zu bekommen.
Mein Beispiel
Der JButton links hat den Focus, erkennbar an der Umrahmung des Textes. Er könnte nun bspw. per Leertaste gedürckt werden.
http://www.abload.de/img/sl54tt.gif (http://www.abload.de/image.php?img=sl54tt.gif)
Der obere JSlider hat den Focus. Per Pfeiltasten ist er nun bedienbar. Leider ist dies aber nicht erkennbar, insbesondere sieht man (ohne es auszuprobieren) nicht, ob und ggfs. welcher JSlider aktiv ist.
http://www.abload.de/img/sl2536i.gif (http://www.abload.de/image.php?img=sl2536i.gif)
Was kann ich da tun?
Sollte out-of-the-Box laufen.
import java.awt.FlowLayout;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Hashtable;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TestingSliders extends JFrame implements ChangeListener,
WindowListener {
JLabel value1;
JLabel value2;
JSlider sl1;
JSlider sl2;
JButton b1;
JButton b2;
public static void main(String[] argv) {
TestingSliders ts = new TestingSliders();
ts.inti();
ts.setSize(300, 300);
ts.setVisible(true);
ts.addWindowListener(ts);
}
public void inti() {
sl1 = new JSlider(JSlider.HORIZONTAL, 0, 10, 5);
sl2 = new JSlider(JSlider.HORIZONTAL, 0, 10, 5);
sl1.addChangeListener(this);
sl2.addChangeListener(this);
sl1.setMajorTickSpacing(10);
sl1.setMinorTickSpacing(1);
sl1.setPaintTicks(true);
sl1.setPaintLabels(true);
sl2.setMajorTickSpacing(10);
sl2.setMinorTickSpacing(1);
sl2.setPaintTicks(true);
sl2.setPaintLabels(true);
value1 = new JLabel("Value 1: 5");
value2 = new JLabel("Value 2: 5");
Hashtable<Integer,JLabel> labelTable1 = new Hashtable<Integer,JLabel>();
labelTable1.put(new Integer(0), new JLabel(""+0));
labelTable1.put(new Integer(5), value1);
labelTable1.put(new Integer(10), new JLabel(""+10));
sl1.setLabelTable(labelTable1);
Hashtable<Integer,JLabel> labelTable2 = new Hashtable<Integer,JLabel>();
labelTable2.put(new Integer(0), new JLabel(""+0));
labelTable2.put(new Integer(5), value2);
labelTable2.put(new Integer(10), new JLabel(""+10));
sl2.setLabelTable(labelTable2);
sl1.setPaintLabels(true);
sl2.setPaintLabels(true);
b1 = new JButton("Out of work - but selectable");
b2 = new JButton("dito");
this.setLayout(new FlowLayout());
this.add(sl1);
this.add(sl2);
this.add(b1);
this.add(b2);
}
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider) e.getSource();
if (!source.getValueIsAdjusting()) {
if (source.equals(sl1)) {
value1.setText("Value 1: " + source.getValue());
}
if (source.equals(sl2)) {
value2.setText("Value 2: " + source.getValue());
}
}
}
public void windowActivated(WindowEvent arg0) { }
public void windowClosed(WindowEvent arg0) {
this.dispose();
System.exit(0);
}
public void windowClosing(WindowEvent arg0) {
this.dispose();
System.exit(0);
}
public void windowDeactivated(WindowEvent arg0) {}
public void windowDeiconified(WindowEvent arg0) {}
public void windowIconified(WindowEvent arg0) {}
public void windowOpened(WindowEvent arg0) {}
}
*Unelegant wäre wohl per FocusListener zu checken, wer dran ist und dann diesen hervorzuheben, z.B. durch die Textfarbe. Angesichts der einfachheit bei Buttons fände ich das aber ziemlich viel Aufwand.
Kommentare bzgl. der alllgemeinen Unzulänglichkeit von Swing, JAVA allgemein oder sonstige Flames lese ich - aber sie helfen mir hier nicht weiter. ;-)
mfg