Breite eines JButton dynamisch ändern

eolith421

Mitglied
Hallo!
Ich versuche derzeit mittles FlowLayout und JButtons einen Zeitplan zu erstellen.

Optisch schaut dieser so aus:
In der ersten Zeile gehen über die gesamte Breite 4 JPanels die die jeweilige Stunde im 15 Minuten Takt enthalten z.B. 16:00, 16:15, 16:30; 16:45. Jedes JPanel ist gleich breit
Darunter gibt es eine Zeile mit JButtons die normalerweise gleich Breit sind wie die JPanels es sei denn es gibt einen Termin z.B.: zwischen 16:00 und 16:15, in diesem Fall hat der JButton die doppelte Breite, es kann aber auch die dreifache oder virefache sein.

Mein Problem ist nun folgendes:
Ich weiß im Vorfeld nicht wie breit der jeweilige JButton sein muss, sondern ich muss z.B. in einem Scheifendurchlauf auf den vorherigen JButton zugreifen und die Breite verändern und genau das ist mein Problme ich bekomme es nicht hin. In der Webanwendung habe ich es genauso mit Vaadin schön realisieren können nur in Swing will es mir nicht gelingen.

Hier ist der entscheidende Codeabschnitt:
Java:
// We check if a reservation exists for the current time
			if(controller.courtReservationExist(court, rowStartTime, rowEndTime)) {
				System.out.println("Court reservation exists on court "+court.getNumber()+" between "+rowStartTime+" and "+rowEndTime);
				
				reservation = controller.getReservations(court, rowStartTime, rowEndTime).get(0);
				
				List<Player> temp = Arrays.asList(reservation.getPlayers());
				for(int i=0; i< temp.size(); i++) {
				
					if(temp.get(i).isGuest()) {
						//buttonText += temp.get(i).getGuest().getName();
					}
					else {
						buttonText += temp.get(i).getMember().getSurname()+" "+temp.get(i).getMember().getFirstname();
					}
					
					if(i%2 == 1)
						buttonText += "\n";
					else
						buttonText += "/";
					
				}
				
				System.out.println("FormerReservation: "+formerReservation.getPid());
				System.out.println("CurrentReservation: "+reservation.getPid());
				
				// Now we check if the found reservation is identically with the formerReservation
				if(reservation.getPid() == formerReservation.getPid()) {
					buttonWidth = buttonWidth+elementWidth;
					System.out.println("Enlarge former reservation");
					
					// We need to get the tempLayout of the former loop
					tempLayout = (JButton) this.getComponent(this.getComponentCount()-1);
					tempLayout.setPreferredSize(new Dimension(buttonWidth,50));
					System.out.println("Button width: "+buttonWidth);
				}
				
				// if the former reservation is not identically with the current reservation a new reservation field is created
				else {
					System.out.println("Add new reservation");
					buttonWidth = elementWidth;
					System.out.println("Button width: "+buttonWidth);

					// Now we create a button which can be clicked
					button = new JButton() {
						private static final long serialVersionUID = 8392427732936504464L;

						public Dimension getPreferredSize(){
							System.out.println("Else button width: "+buttonWidth);
							return new Dimension(elementWidth,50);
						}};
					button.setFont(new Font("Lucida Grande", Font.BOLD, 18));
					button.setForeground(Color.BLACK);
					button.setBackground(Color.WHITE);
					button.setText(buttonText);
					button.setHorizontalAlignment(SwingConstants.CENTER);
					button.addActionListener(new ActionListener() {

						@Override
						public void actionPerformed(ActionEvent arg0) {
							System.out.println("Ausgewählte StartZeit: "+rowStartTime);
							System.out.println("Ausgewählte EndZeit: "+rowEndTime);
						}});
					add(button);
					
					formerReservation = reservation;
				}
				
			}
			
			else {
				System.out.println("No reservation");
				reservation = new Reservation();
				buttonWidth = elementWidth;
				
				button = new JButton() {
					private static final long serialVersionUID = 8392427732936504464L;

					public Dimension getPreferredSize(){
						return new Dimension(elementWidth,50);
					}};
				button.setFont(new Font("Lucida Grande", Font.BOLD, 18));
				button.setForeground(Color.BLACK);
				button.setBackground(Color.WHITE);
				button.setText(buttonText);
				button.setHorizontalAlignment(SwingConstants.CENTER);
				button.addActionListener(new ActionListener() {

				@Override
				public void actionPerformed(ActionEvent arg0) {
					System.out.println("Ausgewählte StartZeit: "+rowStartTime);
					System.out.println("Ausgewählte EndZeit: "+rowEndTime);
				}});
				add(button);
				
			}

Was ist hier mein Denkfehler?
Danke für eure Hilfe!
Florian
 

Hutzli

Aktives Mitglied
müsstest wahrscheinlich einen Thread im Hintergrund laufen lassen, der die Zeit dynamisch überprüft, und je nach dem den Button vergrössert.. Gib doch mal bei google "java Thread" ein ;)
 

Momolin

Aktives Mitglied
Hallo,

machst Du auch ein repaint() auf den Container (JPanel oder ähnlich), nachdem Du die Größe des Buttons geändert hast?

Momolin
 

eolith421

Mitglied
Hallo!
Ich habe inzwischen das Problem anders gelöst:
In einer Schleife wird ein Hilfsobjekt erzeugt welches den Namen des Buttons und auch die Breite des Button enthält.
Anschließend wird diese Schleife durchgelaufen und der Button wird schon beim ersten zeichnen in der richtigen Größe erzeugt.

Hies ist der modifizierte Code:
Java:
private List<ReservationViObject> createReservationList() {
		
		int whileCounter = 0;
		buttonWidth = 0;
		
		// This variable contains if exists the reservation of the last loop
		Reservation formerReservation = new Reservation();
		
		List<ReservationViObject> objects = new ArrayList<ReservationViObject>();
				
		while(whileCounter < numberOfRows) {
			final Date rowStartTime = manipulator.changeDateMinutes(startDate, (interval*whileCounter));
			final Date rowEndTime = manipulator.changeDateMinutes(startDate, ((interval*whileCounter)+interval));
			
			// We temporarily add the reservations for the court to the table
			Reservation reservation;
			// The text of the button
			String buttonText = "";
			
			// We check if a reservation exists for the current time
			if(controller.courtReservationExist(court, rowStartTime, rowEndTime)) {
				//System.out.println("Court reservation exists on court "+court.getNumber()+" between "+rowStartTime+" and "+rowEndTime);
				
				reservation = controller.getReservations(court, rowStartTime, rowEndTime).get(0);
				
				List<Player> temp = Arrays.asList(reservation.getPlayers());
				for(int i=0; i< temp.size(); i++) {
				
					if(temp.get(i).isGuest()) {
						//buttonText += temp.get(i).getGuest().getName();
					}
					else {
						buttonText += temp.get(i).getMember().getSurname()+" "+temp.get(i).getMember().getFirstname();
					}
					
					if(i%2 == 1)
						buttonText += "\n";
					else
						buttonText += "/";
					
				}
				
				//System.out.println("FormerReservation: "+formerReservation.getPid());
				//System.out.println("CurrentReservation: "+reservation.getPid());
				
				// Now we check if the found reservation is identically with the formerReservation
				if(reservation.getPid() == formerReservation.getPid() && whileCounter > 0) {
					buttonWidth = buttonWidth+elementWidth;
					//System.out.println("Enlarge former reservation");
					//System.out.println("Button width: "+buttonWidth);
					
					// We need to get the tempLayout of the former loop
					//System.out.println("LŠnge: "+objects.size()+" whileCounter: "+whileCounter);
					try {
						int index = objects.size()-1;
						
						objects.get(index).setButtonText(buttonText);
						objects.get(index).setReservation(reservation);
						objects.get(index).setWidth(buttonWidth);
						objects.get(index).setRowStartTime(rowStartTime);
						objects.get(index).setRowEndTime(rowEndTime);
					}
					catch(java.lang.IndexOutOfBoundsException e) {
						System.out.println("List: "+objects.toString());
					}
				}
				// if the former reservation is not identically with the current reservation a new reservation field is created
				else {
					//System.out.println("Add new reservation");
					buttonWidth = elementWidth;
					//System.out.println("Button width: "+buttonWidth);
					
					ReservationViObject object = new ReservationViObject();
					object.setButtonText(buttonText);
					object.setReservation(reservation);
					object.setWidth(buttonWidth);
					object.setRowEndTime(rowEndTime);
					object.setRowStartTime(rowStartTime);
					objects.add(object);
					
					formerReservation = reservation;
				}
			}
			// The court has no reservation at that time
			else {
				//System.out.println("No reservation");
				reservation = null;
				buttonWidth = elementWidth;
				//System.out.println("Button width: "+buttonWidth);
				
				ReservationViObject object = new ReservationViObject();
				object.setButtonText(buttonText);
				object.setReservation(reservation);
				object.setWidth(buttonWidth);
				object.setRowEndTime(rowEndTime);
				object.setRowStartTime(rowStartTime);
				objects.add(object);
			}
			
			//System.out.println("ListSize: "+objects.size());
			// now we raise the while counter to create the next row
			whileCounter++;
		}
		
		return objects;
	}

Sowie der Code zum erstellen der Buttons:

Java:
// A List with all Reservation or not Reservation objects
		List<ReservationViObject> reservations = createReservationList();
		
		// Now we create the jButtons
		for(int i=0; i<reservations.size(); i++) {
			final ReservationViObject temp = reservations.get(i);
			
			JButton button = new JButton() {
				private static final long serialVersionUID = 8392427732936504464L;

				public Dimension getPreferredSize(){
					return new Dimension(temp.getWidth(),elementHeight);
				}
			};
			button.setFont(new Font("Lucida Grande", Font.BOLD, 18));
			button.setText(temp.getButtonText());
			button.setForeground(Color.BLACK);
			button.setHorizontalAlignment(SwingConstants.CENTER);
			if(temp.getReservation() == null) {
				button.setBackground(Color.WHITE);
				button.addActionListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent arg0) {
						System.out.println("AusgewŠhlte StartZeit: "+temp.getRowStartTime());
						System.out.println("AusgewŠhlte EndZeit: "+temp.getRowEndTime());
					}});
			}
			else {
				button.setBackground(Color.GRAY);
				button.addActionListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent arg0) {
						System.out.println("Reservation from: "+temp.getReservation().getStartTime().getTime());
						System.out.println("Reservation to: "+temp.getReservation().getEndTime().getTime());
						System.out.println("Reservation 1 player name: "+temp.getReservation().getPlayers()[0].getMember().getSurname());
					}});
			}
			
			add(button);
			
		}

Damit wird das viel eleganter als vorher erzeugt.
Danke für die Hilfe!

Florian
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M breite eines "drawString()-Strings" AWT, Swing, JavaFX & SWT 2
F 2D-Grafik Problem mit höhe||breite eines JFrames AWT, Swing, JavaFX & SWT 4
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
D Breite eines JScrollPane AWT, Swing, JavaFX & SWT 3
P Breite eines JScrollbar vergrößern, aber wie? AWT, Swing, JavaFX & SWT 8
K Höhe und Breite eines Panels im GridBagLayout ermitteln AWT, Swing, JavaFX & SWT 9
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
W JavaFX Button - optimale Breite berechnen AWT, Swing, JavaFX & SWT 1
J Gridpane Breite in Scrollpane automatisch anpassen AWT, Swing, JavaFX & SWT 2
G JavaFX - bugs bei der ermittlung der breite der nodes AWT, Swing, JavaFX & SWT 3
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
C JavaFX TableColumn - TableColumn Breite AWT, Swing, JavaFX & SWT 8
D Swing Breite einer HTML Tabelle in einer JTextPane AWT, Swing, JavaFX & SWT 6
Z Java Draw -JFrame finde nicht die Mitte & höhe, breite AWT, Swing, JavaFX & SWT 7
F Breite beim GridBagLayout festlegen AWT, Swing, JavaFX & SWT 2
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
A trotz setSize keine breite AWT, Swing, JavaFX & SWT 4
M Wie ermittele ich die Breite und Höhe meines Displays in Pixel AWT, Swing, JavaFX & SWT 3
K JSpinner in passender Breite erstellen oder automatisch anpassen AWT, Swing, JavaFX & SWT 2
S JTable Spalte "normale" Breite? AWT, Swing, JavaFX & SWT 5
N Swing Optimale Höhe eine JTextPanes bei festgelegter Breite bestimmen AWT, Swing, JavaFX & SWT 23
L TreeViewerColumn - gesamte TreeView-breite nutzen? AWT, Swing, JavaFX & SWT 5
M 2 Buttons mit derselben Breite AWT, Swing, JavaFX & SWT 9
4 Shapes Informationen wie Breite usw. mitgeben AWT, Swing, JavaFX & SWT 5
B JFileChooser breite der Spalten? AWT, Swing, JavaFX & SWT 5
B Label breite ermitteln vor dem rendern? AWT, Swing, JavaFX & SWT 7
A FormLayout Panel-Breite AWT, Swing, JavaFX & SWT 7
Dit_ Swing JComboBox | Breite des Scrollbalkens AWT, Swing, JavaFX & SWT 4
D JFreeChart Breite (width) ändern AWT, Swing, JavaFX & SWT 6
Rudolf Swing Swing Button breite stanardisieren AWT, Swing, JavaFX & SWT 2
N Swing JPanel Nur Breite festlegen AWT, Swing, JavaFX & SWT 7
F JTabbedPane Reiter breite AWT, Swing, JavaFX & SWT 4
M SWT Breite von Textfeld nur ohne Layout änderbar AWT, Swing, JavaFX & SWT 2
H SWT Breite von componenten zu bestimmen AWT, Swing, JavaFX & SWT 2
S JSlider Track Breite und Farbe AWT, Swing, JavaFX & SWT 2
N breite von JList festlegen AWT, Swing, JavaFX & SWT 3
E Layoutmanager mit fester Breite gesucht AWT, Swing, JavaFX & SWT 9
reibi SWT Breite Taskleiste herausfinden AWT, Swing, JavaFX & SWT 2
C Breite JTextArea/JScrollPane setzen AWT, Swing, JavaFX & SWT 4
S Swing JTable: Spalten mit relativer Breite im ungleichmäßigen Verhältnis AWT, Swing, JavaFX & SWT 2
M Swing JTable + JScrollPane (Breite und Höhenproblem) AWT, Swing, JavaFX & SWT 1
S Für Breite und Höhe werden 0.0 angezeigt AWT, Swing, JavaFX & SWT 2
C Swing JTextArea mit fester Breite und angepasster Höhe??? AWT, Swing, JavaFX & SWT 8
S Table oder TableModel so ueberschreiben, dass Columns minimale Breite haben? AWT, Swing, JavaFX & SWT 2
D JtoolBar feste Breite ? AWT, Swing, JavaFX & SWT 13
P Breite und Höhe des contentPane abfragen AWT, Swing, JavaFX & SWT 3
Y Einzigartigkeit des GridBagLayout - individuelle Höhe/Breite AWT, Swing, JavaFX & SWT 4
J JTextPane mit genau 80 Zeichen breite definieren? AWT, Swing, JavaFX & SWT 3
T Breite des Containers ist gegeben - wie die Höhe berechnen? AWT, Swing, JavaFX & SWT 3
V Swing: Konstant breite Sidebar AWT, Swing, JavaFX & SWT 2
B Feste Breite einer JTextPane, die HTML anzeigt AWT, Swing, JavaFX & SWT 8
G JMenu problem mit der Breite von einer JCheckBox AWT, Swing, JavaFX & SWT 2
A JTextFiled-Breite und Höhe ändern AWT, Swing, JavaFX & SWT 3
B horizontale bzw. vertikale JScrollBar breite von JScrollPane AWT, Swing, JavaFX & SWT 5
S JTable - Breite der Linien AWT, Swing, JavaFX & SWT 8
D GridBagLayout: 2. Spalte auf JPanel-Breite expandieren AWT, Swing, JavaFX & SWT 2
S Feste Breite und Höhe für einen formatierten Text. AWT, Swing, JavaFX & SWT 5
F JTable: Spaltenbreiten an Breite der Zelleninhalte anpassen AWT, Swing, JavaFX & SWT 5
lhein Breite der Scrollbar in einer Combobox ändern AWT, Swing, JavaFX & SWT 5
G Klasse Image - Höhe und Breite ermitteln AWT, Swing, JavaFX & SWT 12
Z Column Breite in JTable automatisch an Inhalt anpassen AWT, Swing, JavaFX & SWT 3
R Breite von JTextField in einem GridBagLayout begrenzen AWT, Swing, JavaFX & SWT 3
B JEditorPane: Höhe für bestimmte Breite bestimmen AWT, Swing, JavaFX & SWT 4
K JTextfield - breite AWT, Swing, JavaFX & SWT 3
S JPanel in JScrollPane in der Breite begrenzen AWT, Swing, JavaFX & SWT 3
M Breite veraendern zwischen 2 JPanels AWT, Swing, JavaFX & SWT 2
D JLabel mit fester Breite und beliebiger Höhe AWT, Swing, JavaFX & SWT 4
L wie kann man die Höhe und Breite von JList festlegen AWT, Swing, JavaFX & SWT 3
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben