AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?!

  • Themenstarter Themenstarter Java22122012
  • Beginndatum Beginndatum
J

Java22122012

Gast
Moin,

folgendes Problem:
Ich habe 2 Choice Auswahlmenüs.
->wenn ich im ersten Menü etwas ändere, so soll sich das zweite Menü anpassen.
(also nur die Einträge beinhalten, die nach der Auswahl aus dem ersten Menü dorthin gehören).

Bsp (Pseudocode):
Choice1 : {A,B,C}
Choice2 : falls Choice1==A dann {A1,A2,A3}
==B dann {B1,B2,B3}
==C dann {C1,C2,C3}

Ich hoffe, man versteht was ich meine 🙂

Das alles ist auch kein Problem, einfach nen itemstatechanged Handler und entsprechend reagieren.

Jedoch gibt es folgendes Problem, wenn die Auswahl aus Choice2 sehr groß ist, sodass gescrollt werden muss:
->es wird nicht die korrekte Auswahl aus choice2 erkannt!

Hier ein einfacher Quellcode, der zum Verstehen gut geeignet ist:

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.Choice;
import javax.swing.JTextField;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

public class choicetest extends JFrame {

	private JPanel contentPane;
	private JTextField textField;

	private Choice choice;
	private Choice choice_1;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					choicetest frame = new choicetest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public choicetest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		choice = new Choice();
		choice.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent arg0) {
				repaint(true);
			}
		});
		choice.setBounds(37, 53, 146, 20);
		contentPane.add(choice);

		choice_1 = new Choice();
		choice_1.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				repaint(false);
			}
		});
		choice_1.setBounds(37, 87, 146, 20);
		contentPane.add(choice_1);

		textField = new JTextField();
		textField.setBounds(35, 135, 164, 37);
		contentPane.add(textField);
		textField.setColumns(10);
		choice.add("Bereich1");
		choice.add("Bereich2");
		choice.add("Bereich3");
		choice.add("Bereich4");
		
		repaint(true);

	}

	public void repaint(boolean r) {
		String alphabetString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		char[] alphabetArray = alphabetString.toCharArray();
		
		
		
		String text ="";
		if(r)
		{
			choice_1.removeAll();
		switch(choice.getSelectedIndex())
		{
			case 0:			
				for (int i = 0; i < alphabetArray.length; i++) {
					choice_1.add("Taste: " + alphabetArray[i]+"1");}
				break;
			case 1:			
				for (int i = 0; i < alphabetArray.length; i++) {
					choice_1.add("Taste: " + alphabetArray[i]+"2");}
				break;
			case 2:			
				for (int i = 0; i < alphabetArray.length; i++) {
					choice_1.add("Taste: " + alphabetArray[i]+"3");}
				break;
			case 3:			
				for (int i = 0; i < alphabetArray.length; i++) {
					choice_1.add("Taste: " + alphabetArray[i]+"4");}
				break;
		}
		}
		textField.setText(choice.getItem(choice.getSelectedIndex())+choice_1.getItem(choice_1.getSelectedIndex()));

	}
}

Das Problem:
->Bereich 1 ausgewählt lassen + in der zweiten Choice mit dem Mausrad bis zu den letzten Eintrag ("Taste Z1") scrollen, und mit linker Maustaste auswählen.
=> Im textfeld steht nun (korrekterweise) "Bereich1Taste: Z1"

->nun in der ersten Choice "Bereich 2" auswählen, und erneut mit dem Mausrad in der zweiten Choice bis zum letzten Eintrag (nun "Taste Z2") scrollen, und mit der linken Maustaste auswählen.
=> Im textfeld steht nun (nicht korrekt!) "Bereich2Taste: A2"

==>Warum?
Wenn ich mit den Pfeiltasten durch die Auswahl navigiere klappt es korrekt.
Jedoch nicht, wenn ich scrollen muss...

Wie kann ich dieses Problem umgehen?

Danke schonmal 🙂
 
Also ich erhalte das gewünschte Ergebnis, sehe keinen Fehler.
Habe jedoch noch einen Hinweis: Swing und AWT sollte man nicht "vermischen".
 
Komisch.

Sowohl bei mir auf zwei Rechnern, als auch bei 2 Bekannten tritt das Problem auf.
Ist jedes mal reproduzierbar :/
->Beim ersten mal Auswählen klappt es problemfrei.
Beim zweiten mal scheint es aus Choice2 nicht korrekt zu picken, und bleibt bei "TasteA" stecken...
(außer, wenn man alles mit Pfeiltasten+Tab durch switcht)...

Zu dem Mischen von awt und swing
->Vielleicht liegt es tatsächlich dadran?

Mit einer JComboBox läuft es problemfrei 🙂

Gibt es eine Möglichkeit, den Fade In Effekt der Choice auf die ComboBox zu übertragen?

danke schonmal 🙂
 
einfacher wäre es sicherlich, auf die swing-komponenten zu verzichten und nur awt zu verwenden: frame anstelle von jframe, textfield anstelle ...etc
 

Zurück
Oben