JLabel durch ActionListener ändern

Tain

Mitglied
Hi leute,

seit einiger zeit versuche ich durch einen JButton aktion einen JLabel zu ändern.
Leider ist mein Programm etwas umfangreich geworden. Das problem ist das ich nicht wirklich auf die Methode zugreifen kann die die JLabels zeichnet um sie neu zu erstellen kann


Java:
package Keys;

import glob.tools.Fehler;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class KeysOberflaeche extends JFrame {

	public JLabel jlabSchluessel;
	public JLabel jlabServer;
	public JLabel jlabName;
	public JLabel jlabAbkuerzung;
	public JLabel jlabBenutzer;
	public JLabel jlabKennwort;
	public JLabel jlabAnwendung;

	public JButton jbutVor;
	public JButton jbutZurueck;
	public JButton jbutErste;
	public JButton jbutLetzte;
	
	MyJPanelCenter a = new MyJPanelCenter();

	private static int counter = 0;

	public static void main(String[] args) throws Fehler {
		new KeysOberflaeche();
	}

	public void control() throws Fehler {
		if (counter == 0) {
			jbutZurueck.setEnabled(false);
			jbutErste.setEnabled(false);
			jbutVor.setEnabled(true);
			jbutLetzte.setEnabled(true);
			
		} else if (counter > 0 && counter < KeysDaoFactory.create().search().size()) {
			jbutZurueck.setEnabled(true);
			jbutErste.setEnabled(true);
			jbutVor.setEnabled(true);
			jbutLetzte.setEnabled(true);
			
		} else if (counter == KeysDaoFactory.create().search().size()) {
			jbutZurueck.setEnabled(true);
			jbutErste.setEnabled(true);
			jbutVor.setEnabled(false);
			jbutLetzte.setEnabled(false);
			
		}
	}

	public void jbutActionListener() throws Fehler {

		jbutVor.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				
				try {
					if(counter < KeysDaoFactory.create().search().size()) {
						counter++;
						control();
					}
				} catch (Fehler e1) {
				}
			}
		});

		jbutZurueck.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				
				if(counter > 0) {
					try {
						counter--;
						control();
					} catch (Fehler e1) {
					}
				}
			}
		});

		jbutErste.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				if(counter > 0) {
					try {
						counter = 0;
						control();
					} catch (Fehler e1) {
					}
					
				}
			}
		});

		jbutLetzte.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				try {
					if(counter < KeysDaoFactory.create().search().size()) {
						counter = KeysDaoFactory.create().search().size();
						control();
					}
				} catch (Fehler e1) {
				}
			}
		});
	}

	public KeysOberflaeche() throws Fehler {

		fenster();
		this.getContentPane().add(new MyJPanelWest(), BorderLayout.WEST);
		this.getContentPane().add(new MyJPanelEast(), BorderLayout.EAST);
		this.getContentPane().add(new MyJPanelNorth(), BorderLayout.NORTH);
		this.getContentPane().add(new MyJPanelSouth(), BorderLayout.SOUTH);
		this.getContentPane().add(new MyJPanelCenter(), BorderLayout.CENTER);
		this.setVisible(true);
	}

	private void fenster() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setSize(800, 640);
	}

	class MyJPanelWest extends JPanel {
		public MyJPanelWest() {
			this.setBackground(Color.YELLOW);
		}
	}

	class MyJPanelEast extends JPanel {
		public MyJPanelEast() {
			this.setBackground(Color.YELLOW);
		}
	}

	class MyJPanelCenter extends JPanel {
		public MyJPanelCenter() {
			this.setBackground(Color.GRAY);
			try {
				setJLabel();
			} catch (Fehler e) {
			}
		}

		public void setJLabel() throws Fehler {

			jlabSchluessel = OberfaecheFactory.labels(""
					+ KeysDaoFactory.create().search().get(counter)
							.getSchluessel());
			jlabServer = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getServer());
			jlabName = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getName());
			jlabAnwendung = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getAnwendung());
			jlabBenutzer = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getBenutzer());
			jlabKennwort = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getKennwort());
			jlabAbkuerzung = OberfaecheFactory.labels(KeysDaoFactory.create()
					.search().get(counter).getAbkuerzung());

			this.add(jlabSchluessel);
			this.add(jlabServer);
			this.add(jlabName);
			this.add(jlabAnwendung);
			this.add(jlabBenutzer);
			this.add(jlabKennwort);
			this.add(jlabAbkuerzung);
		}
	}

	class MyJPanelNorth extends JPanel {
		public MyJPanelNorth() {
			this.setBackground(Color.WHITE);
		}
	}

	class MyJPanelSouth extends JPanel {
		public MyJPanelSouth() {
			this.setBackground(Color.GRAY);
			this.setPreferredSize(new Dimension(100, 100));
			try {
				setBut();
			} catch (Fehler e) {
			}
		}

		public void setBut() throws Fehler {

			jbutLetzte = OberfaecheFactory.button(">>");
			jbutLetzte.setPreferredSize(new Dimension(80, 20));
			jbutVor = OberfaecheFactory.button(">");
			jbutVor.setPreferredSize(new Dimension(80, 20));
			jbutZurueck = OberfaecheFactory.button("<");
			jbutZurueck.setPreferredSize(new Dimension(80, 20));
			jbutErste = OberfaecheFactory.button("<<");
			jbutErste.setPreferredSize(new Dimension(80, 20));

			jbutActionListener();
			
			jbutVor.setEnabled(true);
			jbutZurueck.setEnabled(false);
			jbutErste.setEnabled(false);
			jbutLetzte.setEnabled(true);
			
			
			this.add(jbutErste);
			this.add(jbutZurueck);
			this.add(jbutVor);
			this.add(jbutLetzte);

		}

	}

}

Am ende will ich das durch den ActionListener die setJLabel Methode in der MyJPanelCenter classe
aufgerufen wird.
 
Zuletzt bearbeitet:
keiner deiner Code-Ausschnitte enthält 'die setJLabel Methode', noch irgendein JLabel,

dein ActionListener ändern eine int-Variable, was für sich normalerweise nicht die GUI ändert, und rufen unbekannte Methode control() auf

-------

> if(counter < KeysDaoFactory.create().search().size()) {
> counter = KeysDaoFactory.create().search().size();

sieht übrigens besonders schrecklich aus, wird da bei jedem Buttonklick eine DB-Abfrage gestellt,
hier gar zwei unnötigerweise direkt hintereinander?

cache doch die Max-Anzahl

----

wenn der Counter bis auf 0 runtergehen kann und bis auf size() hoch, dann hast du size+1 verschiedene Indexe
 
Zuletzt bearbeitet von einem Moderator:
sorry hab falschen ausschnitt eingefügt --> wurde oben geändert

Problem ist das am ende die Datensätze sich ändern können(kommt noch) und sich deshalb die Size ändern kann
 
Zuletzt bearbeitet:
wenn du zur Laufzeit neue JLabels erstellst, dann musst du erst alle alten im Panel entfernen,
am einfachsten mit removeAll(),
die neuen einfügen und am Ende
validate();
repaint();
am JFrame aufrufen

leichter wäre es, die JLabel nur einmal zu erstellen und später nur mit setText() deren Text zu ändern

---


siehe auch edits in vorherigen Post
 

Zurück
Oben