JRadioButton refresh

M4D-M4X

Bekanntes Mitglied
Zuerstmal hallo an Alle, die sich meines kleinen bescheidenen Problems annehmen wollen.

Und zwar möchte ich eine GUI zu einem quasi Kopier/Umbenenn Programm für eine bestimmte Software schreiben.

Das Problem ist, dass man den Pfad ändern kann, in dem die Dateien liegen und ich über einen Refreshbutton(RefreshVesps) möchte, dass die RadioButtons der alten dateien verschwinden und die neuen hinzugefügt werden.
Die Dateinamen werden als RadioButtons dargestellt und automatisch bei programmstart eingefügt.

Ich habe es bereits mit validate(), repaint(), invalidate(), setvisivle(true/false) probiert, aber nichts hat geholfen.


Der Code meiner GUI Klasse ist wie folgt:

Java:
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import javax.swing.*;
import java.util.*;
import java.util.Timer;


public class CreateWindow extends JFrame {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	Logic Program = new Logic();
	ArrayList <String> salGetConfig = new ArrayList <String> (0);
	ButtonGroup JRadioGroup = new ButtonGroup();
	final ArrayList <JRadioButton> JRButtons = new ArrayList <JRadioButton> (0);
	JFrame frame = new JFrame("Vesp.imp Switcher");
	Panel panel = new Panel();
	Timer timer = new Timer();
	String [] ICVersions = new String[2];
	String sICVersion = "";
	String sVespOrdner="";
	String ConfigPath =  System.getProperty("user.dir");;
	String ICPath = "";
	int iheight = 50;
	

	public CreateWindow() throws IOException{
			
			ICVersions[0] = "IC71";
			ICVersions[1] = "IC72";
			frame.setBounds(460, 230, 300, 350);
		    frame.setVisible(true);
		    panel.setLayout(null);
		    
		    FileReader File = new FileReader("C:/Dokumente und Einstellungen/mallgaier/Desktop/Config.ini");
		    BufferedReader read = new BufferedReader(File);
		    String zeile = "";
		    
		    while((zeile=read.readLine()) !=null ){
		    	salGetConfig.add(zeile);
		    }
		    
		    ICPath = salGetConfig.get(0);
		    sVespOrdner = salGetConfig.get(1);  
	}
	
	public void Window() throws IOException{
		
			final ImageIcon icon = new ImageIcon("C:/Dokumente und Einstellungen/mallgaier/Desktop/VespImpSwitcherLOGO.PNG") ;
				final JLabel imageLabel = new JLabel(icon);
				imageLabel.setBounds(60, 5, 178, 39);
				frame.add(imageLabel);
		
			final JButton JHelp = new JButton(new ImageIcon("C:/Dokumente und Einstellungen/mallgaier/Desktop/help.jpeg"));
				JHelp.setBounds(10, 5, 35, 34);
				frame.add(JHelp);
			    
			JHelp.addActionListener( new ActionListener() { 
				  @Override public void actionPerformed( ActionEvent e ) { 
				  
				}} 
		    ); 
				
			final JLabel MadeBy = new JLabel("Made by Max");
				MadeBy.setBounds(112,300,80,20);
				frame.add(MadeBy);
			
		    
		    final JLabel VespFolder = new JLabel("Vesp Ordner:");
		    	VespFolder.setBounds(30, 245, 105, 20);
		    	frame.add(VespFolder);
		    
			final JLabel SetPath = new JLabel("IC Pfad:");
				SetPath.setBounds(60, 272, 105, 20);
				frame.add(SetPath);	
		    	
		    
		    final TextArea TACInf = new TextArea("Copy Information:"+'\n'+""+'\n');
		    	TACInf.setBounds(5, 50, 140, 165);
			 	TACInf.setEditable(false);
			 	frame.add(TACInf);
			
			
			 final JFormattedTextField TFSetPath = new JFormattedTextField(ICPath);
			 	TFSetPath.setBounds(115, 275, 175, 15);
			 	frame.add(TFSetPath);
			   
			 final JFormattedTextField TFVespFolder = new JFormattedTextField(salGetConfig.get(1));
			 	TFVespFolder.setBounds(115, 248, 175, 15);
			 	frame.add(TFVespFolder);
		  		   	    		       
			TFVespFolder.addActionListener( new ActionListener() { 
				@Override public void actionPerformed( ActionEvent e ) { 
					Program.getVespsIn(sVespOrdner);
					
				} 
			} ); 
			 	
			 	
			final JButton Exit = new JButton("Exit");
				Exit.setBounds(220,300,60,20);
				frame.add(Exit);
			
			Exit.addActionListener( new ActionListener() { 
				  @Override public void actionPerformed( ActionEvent e ) { 
				    System.exit( 0 ); 
				  } 
				} ); 
			
			
			final JComboBox ICVersion = new JComboBox(ICVersions);
				ICVersion.setBounds(5, 220, 50, 20);
				ICVersion.setSelectedIndex(1);
				frame.add(ICVersion);
			
			 ICVersion.addActionListener( new ActionListener() { 
				  @Override public void actionPerformed( ActionEvent e ) { 
				    if(ICVersion.getSelectedIndex() == 0){
				    	ICPath =  System.getenv("Avaya_"+ICVersions[0]+"_HOME");
				    	if(ICPath == null){
				    		ICPath ="";
				    		TFSetPath.setText(ICPath);
				    	}
				    	else{
				    		TFSetPath.setText(ICPath+"/etc");
				    	}
				    	TFSetPath.updateUI();

				    }
				    else if(ICVersion.getSelectedIndex() == 1){
				    	ICPath =  System.getenv("Avaya_"+ICVersions[1]+"_HOME");
				    	TFSetPath.setText(ICPath+"/etc");
				    	TFSetPath.updateUI();
				    }
				  } 
				} ); 
			 
			 final JButton SaveConfig = new JButton("Save Config");
			 	SaveConfig.setBounds(184, 220, 105, 20);
				frame.add(SaveConfig);
			 
			SaveConfig.addActionListener( new ActionListener() { 
				@Override public void actionPerformed( ActionEvent e ) {  
					try {
						Program.WriteConfig(TFSetPath.getText(),TFVespFolder.getText());
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}
			});

			 final JButton Refresh = new JButton("Refresh Vesps");
			 	Refresh.setBounds(60, 220, 120, 20);
				frame.add(Refresh);
			 
			Refresh.addActionListener( new ActionListener() { 
				@Override public void actionPerformed( ActionEvent e ) {  
					sVespOrdner = TFVespFolder.getText();
					for(int i = 0;i<JRButtons.size();i++){
						JRadioButton Test = JRButtons.get(i);
						
						JRadioGroup.remove(Test);
						frame.remove(Test);
					}	
					JRButtons.clear();
					JRadioGroup = new ButtonGroup();
					refreshJRButtons();
					frame.validate();
				}
			});
			
			 final JButton Apply = new JButton("Apply");
				Apply.setBounds(5, 300, 70, 20);
				frame.add(Apply);
			
			Apply.addActionListener( new ActionListener() { 
				  @Override public void actionPerformed( ActionEvent e ) { 
					  try {
						  
					
						String Choice = "";
						for(int i = 0;i<JRButtons.size();i++){
							JRadioButton JRButton = JRButtons.get(i);
							if(JRButton.isSelected()){
								Choice = JRButton.getName();
							}
						} 
						ArrayList <String> CopyInformation = Program.ChangeVesp(TFVespFolder.getText(),TFSetPath.getText(),Choice);
						for(int i = 0; i<CopyInformation.size();i++){
							TACInf.append(CopyInformation.get(i));
						}
					  } 
					  catch (Exception e1) {
						e1.printStackTrace();
					  }}}); 
					 
			refreshJRButtons();
			frame.add(panel);
		    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		    frame.setResizable(false);
			frame.setVisible(true);
	}
	
	
		
	private void refreshJRButtons(){
		
		iheight = 50;
		String []saNumRButtons = Program.getVespsIn(sVespOrdner);
		for(int i =0;i<saNumRButtons.length;i++){
			//erstellen des RButtons
			JRadioButton RButton = new JRadioButton(saNumRButtons[i]);
			RButton.setName(saNumRButtons[i]);
			RButton.setBounds(150, iheight, 400, 20);
			
			
			//hinzufügen des RButtons
			JRButtons.add(RButton);
			frame.add(RButton);
			JRadioGroup.add(RButton);
			
			//Höhenbestimmung + selection
			iheight = iheight + 20;
			if(RButton.getName().equals("Vesp.imp")||RButton.getName().equals("vesp.imp")){
				RButton.setSelected(true);						
			}
		}
	}

}

Ich habe anbei noch eine Grafik angehängt wie die GUI aussieht.

Zu sagen ist noch, dass ich kein Panel oder Container verwende, da ich mich ehrlichgesagt nicht über den Sinn von diesen Komponenten bewusst bin (auch nach mehreren Tutorials etc.).

Es wäre toll wenn ihr mir weiterhelfen könntet, ich hab daran gestern schon mindestens 5 Stunden verbracht.
 
Zuletzt bearbeitet:

Verjigorm

Top Contributor
Hallo,

also als aller erstes: Variablennamen schreibt man klein!
Generell ist dein Code ziemlich grausam und du solltest vielleicht nochmal ein paar einfache Swing Tutorials durcharbeiten. :rtfm:

Was mir so spontan zusätzlich aufgefallen ist:
- frame.setVisible(true); sollte der letzte Befehl sein, den du aufrufst, alles was danach kommt und die GUI noch beeinflusst muss extra neugezeichnet werden.
- du initialisierst ein panel mit NullLayout und benutzt es dann nicht wirklich :autsch: , aber wie du ja schon schreibst, sind dir Containerklassen noch nicht ganz vertraut. Das solltest du schnell ändern.
- Dein Problem liegt imho im Befehl frame.validate();
besser ist hier vermutlich frame.getContenPane().revalidate() aber das ist nur eine erste Vermutung

mfg Verjigorm
 

M4D-M4X

Bekanntes Mitglied
Zuerstmal Danke für die schnelle Antwort :)

Ich programmiere erst seit ca. einem halben Jahr und bin da noch relativ in der Lernphase :oops:
Hab das mit dem frame.getContentPane(),validate() jetzt mal ausprobiert, jedoch erfolglos.

Die Buttons verschwinden zwar (genauso wie vorher) aber die neuen werden nicht hinzugefügt.

Und zu dem Panel:
Das Panel brauche ich doch jetzt in diesem Falle, damit ich für den frame kein layout habe und meine
Bounds bestimmen kann oder nicht ?
Sonst hat das bei mir nie funktioniert.

Darf ich fragen was genau an dem Code so grausam is ?
Dürft ruhig schimpfen! Ich bin froh drum :D
 

KrokoDiehl

Top Contributor
Die RadioButtons sollen doch immer gleich sein, aber nur ihren Zustand je nach Datei ändern, sehe ich das richtig?
Was du aber machst (...ich habe deinen Code nur überflogen...) ist, immer neue Radiobuttons zu erstellen. Das ist prinzipiell möglich, aber doch eher untypisch.

Prinzipiell muss man, wenn man das Layout zur Laufzeit ändert, die alten Komponenten vom Container entfernen und dann die neuen hinzunehmen. Dann braucht man im Normalfall auch kein
Code:
revalidate()
,
Code:
repaint()
usw. (wobei ich beim NullLayout nicht sicher bin).

Wenn man den Status von RadioButtons (in deinem Fall) anpassen will, würde ich das ereignisgesteuert machen. An irgendeiner Stelle muss du ja mitbekommen, wenn der Pfad geändert wird. Dann an der Stelle dafür sorgen, dass die Radiobuttons mit
Code:
setSelected()
aktualisiert werden. Wie genau ist dann je nach Struktur des Programms unterschiedlich.

Was in denem Code nun auch dafür verantwortlich sein könnte ist, dass die alten Rediobuttons nie vom Container (
Code:
frame
) entfernt werden (via
Code:
remove()
).
 

M4D-M4X

Bekanntes Mitglied
Ich hab jetzt nochmal über meinen Code gesehen und es mit der Funktion
"frame.getContentPane().repaint()" versucht.
Diese funktioniert aber auch nur dann wenn ich jeden Button einzeln repainte... Das kann ja auch irgendwie nicht sein oder ?

Anschließend habe ich festgestellt dass ich ein AWT Panel verwende... habe es gegen ein Swing Panel ausgetauscht und seitdem geht es ... FAST! o_O

Die Buttons werden jetzt generiert aber erst angezeigt, nachdem man mit der Maus darüber fahrt...
es ist für mich einfach ein Mysterium :rtfm:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A 2D-Grafik Zeichen werden über unabhängingen JRadioButton nicht gefüllt AWT, Swing, JavaFX & SWT 28
M Aktion ausführen wenn ein JRadiobutton deselektiert wird. AWT, Swing, JavaFX & SWT 3
P Wie lese ich einen jRadioButton aus? AWT, Swing, JavaFX & SWT 21
S JRadioButton und JCheckBox im JTree AWT, Swing, JavaFX & SWT 14
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
W Bei Programmstart jRadioButton automatisch auswählen AWT, Swing, JavaFX & SWT 2
W JRadioButton sauber untereinander anordnen AWT, Swing, JavaFX & SWT 3
G JRadioButton aktualisieren nicht... AWT, Swing, JavaFX & SWT 10
P JRadioButton.isSelected() Problem AWT, Swing, JavaFX & SWT 10
M Makierung bei JRadioButton entfernen AWT, Swing, JavaFX & SWT 5
H Swing Auf Änderung bei JRadioButton reagieren. AWT, Swing, JavaFX & SWT 3
Y JRadioButton soll JTextBox aktivieren UND deaktivieren AWT, Swing, JavaFX & SWT 3
Zettelkasten Swing JRadioButton festlegen AWT, Swing, JavaFX & SWT 2
M jradiobutton in jtable AWT, Swing, JavaFX & SWT 4
E JRadiobutton AWT, Swing, JavaFX & SWT 11
Guybrush Threepwood JRadioButton transparent AWT, Swing, JavaFX & SWT 2
J LayoutManager Layout über JRadiobutton Wechseln AWT, Swing, JavaFX & SWT 6
S Frage zu JRadioButton AWT, Swing, JavaFX & SWT 2
H JRadioButton.requestFocus() - Problem AWT, Swing, JavaFX & SWT 2
G JRadioButton-Platzierung AWT, Swing, JavaFX & SWT 4
W JRadioButton / JCheckBox problem AWT, Swing, JavaFX & SWT 6
F Problem mit JRadioButton AWT, Swing, JavaFX & SWT 4
S JradioButton oder Toggle AWT, Swing, JavaFX & SWT 2
M JradioButton und ItemListener AWT, Swing, JavaFX & SWT 4
D JRadioButton Object AWT, Swing, JavaFX & SWT 2
P JRadioButton in Schleife erstellen > wo liegt mein Fehler AWT, Swing, JavaFX & SWT 2
I JRadioButton disablen geht nicht AWT, Swing, JavaFX & SWT 4
K JLabel / JRadioButton in Tabelle anzeigen AWT, Swing, JavaFX & SWT 7
T JRadioButton abfragen AWT, Swing, JavaFX & SWT 1
G JRadioButton in eine Tabelle AWT, Swing, JavaFX & SWT 4
F JRadioButton dynamisch benennen? AWT, Swing, JavaFX & SWT 7
B JRadioButton nicht auswählbar AWT, Swing, JavaFX & SWT 2
G JRadioButton beim deselektieren Wert ändern. AWT, Swing, JavaFX & SWT 2
M JRadioButton auslesen? AWT, Swing, JavaFX & SWT 8
G JRadioButton dynamisch erzeugen AWT, Swing, JavaFX & SWT 6
J LineBorder bei JRadioButton AWT, Swing, JavaFX & SWT 3
G JRadioButton deaktivieren? AWT, Swing, JavaFX & SWT 6
R jRadioButton AWT, Swing, JavaFX & SWT 4
Juelin Objekte refresh AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Stage reload, refresh ... AWT, Swing, JavaFX & SWT 3
D ComboBoxCellEditor Refresh beim Focus AWT, Swing, JavaFX & SWT 4
T JTable Cell Refresh AWT, Swing, JavaFX & SWT 5
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
C SWT refresh einer Tabelle AWT, Swing, JavaFX & SWT 4
J SWT Globale Refresh-Aktion programmtechnisch aufrufen AWT, Swing, JavaFX & SWT 6
L Probleme beim Refresh von JTable AWT, Swing, JavaFX & SWT 7
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
K SWT TableViewer refresh() im Dialog AWT, Swing, JavaFX & SWT 2
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
S Refresh von JTableModel funktioniert nur ein Mal AWT, Swing, JavaFX & SWT 4
D JList, JTree, JTextarea - Daten"refresh" AWT, Swing, JavaFX & SWT 15
L JFrame Refresh-Problem AWT, Swing, JavaFX & SWT 4
A Refresh JPanel AWT, Swing, JavaFX & SWT 6
R Refresh Label AWT, Swing, JavaFX & SWT 4
J Expertenfrage zu Refresh nach hinzufuegen von Componeten? AWT, Swing, JavaFX & SWT 8
dzim NullPointer bei refresh() einer JFace TableViewer AWT, Swing, JavaFX & SWT 2
Lazybone JTree refresh Problem AWT, Swing, JavaFX & SWT 3
X Focusproblem beim Refresh eines jLabels AWT, Swing, JavaFX & SWT 4
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
D jTabbedPane refresh AWT, Swing, JavaFX & SWT 2
S Display Refresh AWT, Swing, JavaFX & SWT 2
X Refresh eines Frames AWT, Swing, JavaFX & SWT 1
P JFrame refresh AWT, Swing, JavaFX & SWT 2
m@nu JTree: Äste nach refresh wiederherstellen AWT, Swing, JavaFX & SWT 3
M Wi mache ich einen refresh AWT, Swing, JavaFX & SWT 4
C GUI-Refresh funktioniert nicht AWT, Swing, JavaFX & SWT 3
D JList Refresh AWT, Swing, JavaFX & SWT 19

Ähnliche Java Themen

Neue Themen


Oben