Richtige Klasse ändern

Status
Nicht offen für weitere Antworten.

richardkrieger

Aktives Mitglied
Hallo,

ich wusste nicht, wie ich das Problem mit Worten erklären sollte, deswegen habe ich so ein kleines Programm geschrieben - 2 Klassen und 1 Interface.
Startklasse:
Code:
package test;
import java.awt.BorderLayout;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class TestClass implements TKInterface{
	public static void main(String[] args){
		int i=0;
		JFrame hfenster=new JFrame("TestApp");
		hfenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		hfenster.setLayout(new BorderLayout());
		JPanel editpanel=new JPanel();
		editpanel.add(editfeld);
		JButton aendern=new JButton("Ändern");
		// aendern.setActionListener an wen?
		editpanel.add(aendern);
		hfenster.add(editpanel,BorderLayout.NORTH);
		JPanel anzeige=new JPanel();
		anzeige.setLayout(new BoxLayout(anzeige,BoxLayout.Y_AXIS));
		for(i=0;i<=10;i++){ // 10 nur als Beispiel. 
			anzeige.add(new DatenSatz().erstellen());
		}
		JScrollPane scroll=new JScrollPane(anzeige);
		hfenster.add(scroll,BorderLayout.CENTER);
		hfenster.setSize(300,300);
		hfenster.setVisible(true);
	}
Interface:
Code:
package test;
import javax.swing.JTextField;
public interface TKInterface {
	JTextField editfeld=new JTextField(10);
}
2te Klasse:
Code:
package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

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

public class DatenSatz implements ActionListener,TKInterface{

	String labeltext="Labeltext";
	JLabel daten=new JLabel();
	
	public JPanel erstellen(){
		Date adatum=new Date();
		long namecomp=adatum.getTime();
		JPanel rgpanel=new JPanel();
		daten.setText(""+namecomp);
		JButton editieren=new JButton("Editieren");
		editieren.addActionListener(this);
		editieren.setActionCommand("EDIT");
		rgpanel.add(daten);
		rgpanel.add(editieren);
		rgpanel.setBorder(BorderFactory.createEtchedBorder());
		return rgpanel;
	}
	
	public void actionPerformed(ActionEvent aev) {
		if(aev.getActionCommand().equals("EDIT")){
			editfeld.setText(daten.getText());
		}
	}
}

Code ist funktionsfähig.
2te Klasse wird für jeden Datensatz mit neuen Daten instanziiert. Wenn ich im Datensatz auf "Editieren" klicke, wird Text des jew. Labels zum bearbeiten nach oben in JTextField übergeben, kann auch bearbeitet werden. Nach der Bearbeitung, wenn ich oben auf "Ändern" klicke, soll unten JPanel, wo ich auf "Edit" geklickt habe, aktualisiert werden. Hier habe ich als Beispiel nur 10 Panels genommen, tatsächlich ist die Anzahl variabel, halt so viel, wie viele Datensätze es gibt.

Es muss RICHTIGE JPanel aktualisiert werden und ich weiss nicht, wie ich es bestimmen kann.
 
erstaunlich, dass das so geht, aber auch ganz schön schreckliches Design,

grobes Vorgehen: im Interface auch die aktuelle Nummer oder gleich den aktuellen Datensatz speichern,
im Frame ein ActionListener, der dann im richtigen Datensatz das JLabel aktualisiert,

dringend zum empfehlen ist aber ein genereller Neuaufbau des ganzen,
etwas besser (noch lange nicht sauber) siehts so aus, Interface nicht mehr benötigt:

Code:
package test;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class TestFrame extends JFrame implements ActionListener {
	JTextField editfeld = new JTextField(10);
	private DatenSatz aktDaten;
	public TestFrame() {
		super("TestApp");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(new BorderLayout());
		JPanel editpanel = new JPanel();

		editpanel.add(editfeld);
		JButton aendern = new JButton("Ändern");
		aendern.addActionListener(this);
		editpanel.add(aendern);
		getContentPane().add(editpanel, BorderLayout.NORTH);
		JPanel anzeige = new JPanel();
		anzeige.setLayout(new BoxLayout(anzeige, BoxLayout.Y_AXIS));
		for (int i = 0; i <= 10; i++) { // 10 nur als Beispiel.
			anzeige.add(new DatenSatz().erstellen(this));
		}
		JScrollPane scroll = new JScrollPane(anzeige);
		getContentPane().add(scroll, BorderLayout.CENTER);
		setSize(300, 300);
		setVisible(true);
	}

	public void setEditText(String st,DatenSatz aktDaten) {
		this.aktDaten = aktDaten;
		editfeld.setText(st);
	}
	public void actionPerformed(ActionEvent aev) {
		aktDaten.setDatenText(editfeld.getText());
	}
	public static void main(String[] args) {
		new TestFrame();
	}
}

---------

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

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

public class DatenSatz implements ActionListener {

	String labeltext = "Labeltext";
	JLabel daten = new JLabel();
	TestFrame frame;

	public void setDatenText(String st) {
		daten.setText(st);
	}

	public JPanel erstellen(TestFrame frame) {
		this.frame = frame;
		Date adatum = new Date();
		long namecomp = adatum.getTime();
		JPanel rgpanel = new JPanel();
		daten.setText("" + namecomp);
		JButton editieren = new JButton("Editieren");
		editieren.addActionListener(this);
		editieren.setActionCommand("EDIT");
		rgpanel.add(daten);
		rgpanel.add(editieren);
		rgpanel.setBorder(BorderFactory.createEtchedBorder());
		return rgpanel;
	}

	public void actionPerformed(ActionEvent aev) {
		if (aev.getActionCommand().equals("EDIT")) {
			frame.setEditText(daten.getText(),this);
		}
	}
}
 
richardkrieger hat gesagt.:
Code:
package test;
import javax.swing.JTextField;
public interface TKInterface {
	JTextField editfeld=new JTextField(10);
}

Vergiß aber nicht das diese Declaration identisch ist zu

Code:
package test;
import javax.swing.JTextField;
public interface TKInterface {
	public static final JTextField editfeld=new JTextField(10);
}

Das heißt, das es in der gesamten Applikation nur ein einziges editfeld existiert.


Java Language Specification hat gesagt.:
Every field declaration in the body of an interface is implicitly public, static, and final
 
DANKE FÜR DIE HILFE!

zu Design: da hast du recht. in der original-app sieht es anders aus. mit diesem beispiel wollte ich nur zeigen, wo das problem liegt

DANKE!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben