Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich hab ein Programm mit mehreren Klassen (welch wunder ^^). Eine Klasse enthält eine actionPerformed Methode in der ich eine Integer Zahl erhalte. Diese Zahl(wert) möchte ich in einer anderen Methode (die auch in einer anderen Klasse ist) verwenden. Wie geht das? Ich muss irgend wie glaub ich von meiner Klasse bzw Methode wo ich den Wert brauche die integer Zahl aufrufen. brauch ich dafür eine get() Methode und wenn ja wie sieht die syntax dann aus? thx
public class A implements ActionListener{
private int value;
public int getValue(){
return value;
}
public void actionPerformed ...
}
Zweite Klasse
Code:
public class B{
private A a;
public B ( A a ){
this.a = a;
}
public void doSomething(){
int value = a.getValue();
}
}
Etwa so startet das Programm
Code:
public static void main( String[] args ){
A a = new A();
B b = new B( a );
}
Du bemerkst was? Ja, B muss eine Instanz von A kennen. Hier ist es so gelöst, dass B im Konstruktor eine Instanc von A erhält, welche B speichern muss *zwecks späterer Verwendung*.
Was immer Du machst, irgendwo muss die zweite Klasse einen Weg besitzen, eine Instanz der ersten Klasse zu finden. Gibt es diesen nicht, kann der Integer nicht übertragen werden.
mfg Beni
P.S. nicht mit static lösen, das funktioniert zwar auch, ist aber nur schlecht erweiterungsfähig, und nicht wirklich OOP
Hässlich, grauslich, unnütz, nicht erweiterbar, eindimensional, einfach schlimm.
Ich kanns fast nicht sagen, aber etwa so:
Code:
class A implements ActionListener{
private static int value;
public static int getValue(){
return value;
}
}
Code:
public class B{
public void doSomething(){
int value = B.getValue();
}
}
Aber auf diese Weise gibt es nur ein value, und das kann sehr schnell zum Verhängnis werden (spätestens wenn Du einen zweites A machst). Also gewöhne dich gar nicht erst an "static", die andere Methode ist viel besser.
Wenn ich dein beispiel teste hab ich beim aufruf der instanzen einen fehler:
Code:
class lernen {
public class A {
private int value;
public int getValue(){
return value;
}
}
public class B {
private A a;
public B ( A a ) {
this.a = a;
}
public void doSomething(){
int value = a.getValue();
}
}
public static void main( String[] args ){
A a = new A();
B b = new B( a );
}
}
@Beni: tzzz was hast du gegen static? wenn man weiß dass man nur eine instanz der klasse anlegen will ( zum beispiel eine klasse zum erzeugen der gui) dann sind static variablen und methoden ziemlich sinnvoll ...
@Roar
Wenn Du um ein neues Fenster zu machen nur "new MainFrame()" aufrufen musst, und dieses neue MainFrame dann wie ein eigenes Programm funktioniert, dann nenne ich ein Programm gut geschrieben. Und mit static wirst du das garantiert nicht erreichen.
[edit]
@deathbyaclown
War wohl zu langsam.
Mein Greuel kommt von der nicht-OOP-heit von static, und weil static oft ein *sehr* billige Lösung ist (sog.: Hack...)
[/edit]
@Gast
Das ist ein Problem innerer Klassen und static-Methoden
- Entweder bezeichnest Du die Klassen ebenfalls als static
- Oder du ziehst die Klassen aus "lernen" hinaus.
Hier die zweite Möglichkeit:
Code:
public class Lernen {
public static void main(String[] args) {
A a = new A();
B b = new B(a);
}
}
class A {
private int value;
public int getValue() {
return value;
}
}
class B {
private A a;
public B(A a) {
this.a = a;
}
public void doSomething() {
int value = a.getValue();
}
}
Es gibt aber noch das Problem das ich bei der action..Methode keinen wert zurückgeben kann
Das ist meine Methode. Um genau zu sagen wird sie bei einem Textfeld genutzt. ich gebe einen Wert ein (zahl) und den möchte ich in einer anderen Methode (die in einer anderen klasse ist) nutzen.
Code:
public void actionPerformed(ActionEvent e)
{
String eingabe= e.getActionCommand();
zahl = Double.valueOf(eingabe).intValue();
}
public class C{
public void doSomething( int value ){
...
}
}
Code:
public void actionPerformed(ActionEvent e){
String eingabe= e.getActionCommand();
zahl = Double.valueOf(eingabe).intValue();
C c = ...
c.doSomething( zahl );
}
public void actionPerformed(ActionEvent e)
{
String eingabe= e.getActionCommand();
zahl = Double.valueOf(eingabe).intValue();
System.out.println(zahl);
FileTableModel c = new FileTableModel();
c.getValueAt( zahl );
}
wo bei fehler bei new FileTableModel (Konstruktor icht definiert) und getValueAt (die methode im typ filetablemodel ist für argumente nicht andwendbar(int)) auftritt.
Wie ihr seht ist meine andere Klasse wo ich den Wert nutzen will ein TableModel (abgeleitet von abstract table model) wo die methode getValue (in der ich den wert nutzen will) schon vordefiniert ist.[/code]
@Roar
Wenn Du um ein neues Fenster zu machen nur "new MainFrame()" aufrufen musst, und dieses neue MainFrame dann wie ein eigenes Programm funktioniert, dann nenne ich ein Programm gut geschrieben. Und mit static wirst du das garantiert nicht erreichen.
i
neneneee
wenn ich new MainFrame() aufrufe, dann funzut das auch.. aber was ist wenn ich eine klasse hab, die keine instanz von MainFrame zur Verfügung hat/ keine haben soll ?
tja, sei etwas flexibler. Schreibst du halt noch den Konstruktor, nimmst nicht "getValue" sondern "getIntValue", ... :wink:
Jetzt aber ernsthaft:
- Wie lange ist der Code des gesammten Programmes? Wenn er nicht zu lang ist, kannst Du ihn hier mal posten (oder die wichtigen Teile davon), dann gibts eine Antwort die besser auf dein Problem passt.
- mit "new" machst Du ein neuen FileTableModel. Wahrscheinlich nicht sehr gut, da Du ja mit einem anderen arbeiten willst?
Aber bevor ich mehr plappere (möglicherweise Unsinn der dich nur verwirrt :wink will ich mal deinen Code sehen!
Naja der Code ist schon etwas länger da das Programm sowas wie den Explorer dann darstellt (also linke seite nen tree und rechte seite ist bei mir ein tablemodel. es ging mir darum das ich im tree einen path anwähle also selektiere, auf der rechten seite erscheint dann in der tabelle: name größe und letztes änderungsdatum der datein die im angewählten ordner sind. so nun hab ich noch ein menuitem eingefügt. wenn man den drückt öffnet sich ein neues frame wo man in ein textfeld eine zahl eingeben soll. diese zahl(jahr) soll dann als vergleich mit den letzten ändernugsdatum der datein arbeiten und mir nur die datein im table anzeigen die jünger sind als das eingegebende datum.
da der code zu lang ist hier erstmal wie ich an den selektierten pfad im JTree komme:
Code:
jTree.addTreeSelectionListener(
new TreeSelectionListener()
{
public void valueChanged ( TreeSelectionEvent e)
{
TreePath path = e.getNewLeadSelectionPath();
pathname = (myFile)path.getLastPathComponent();
hier nun das wichtige Tablemodel
Code:
class FileTableModel extends AbstractTableModel { // Klasse erweitert AbstractTableModel
protected File dir; //schuetzt File dir
public String[] filenames;
protected String[] columnNames = new String[] { "Typ", "Name", "Größe", "zuletzt geändert" };
protected Class[] columnClasses = new Class[] { ImageIcon.class, String.class, Long.class, Date.class };
// Dieses Tabellenmodell funktioniert für jedes gegebene Verzeichnis
int eingabe;
public FileTableModel(File dir) {
this.dir = dir;
this.filenames = dir.list();
}
public void setDir (myFile pathname) {
this.dir = pathname;
this.filenames = dir.list();
}
// Gibt die Anzahl der Spalten (Columns)
public int getColumnCount() {
return 4;
}
// Gibt die Anzahl der Reihen (rows)
public int getRowCount() {
return filenames.length;
}
// Anzahl der Dateien im Verzeichnis
// Informationen über die einzelnen Spaltennamen
public String getColumnName(int col) {
return columnNames[col];
}
public Class getColumnClass(int col)
{
return columnClasses[col];
}
// Die Methode, die den Wert der einzelnen Zellen zurückgibt
public Object getValueAt(int row, int col) { // Mit getValueAt fragt die Tabelle beim Modell nach dem Wert einer bestimmten Zelle
File f = new File(dir, filenames[row]);
Date ff = new Date(f.lastModified());
int jahr = ff.getYear();
if (jahr < 103) [b]<-------------------------- HIER SOLL ANSTATT der 103 DANN MEIN ÜBERGEBENDER WERT [/b]
{
switch (col) {
case 0: return null;
case 1: return null;
case 2: return null;
case 3: return null;
default: return null;
}
}
else
{
switch(col) {
case 0: return new ImageIcon(getIconImage2(f));
case 1: return filenames[row];
case 2: return new Long(f.length());
case 3: return ff;
//case 3: return new Date(f.lastModified());
default: return null;
}
}
}
}
woher ich den Wert bekomme hatte ch ja schon gepostet glaub ich. also über eine eingabe im textfeld.
Wie sieht der Aufbau deines Programmes aus? Die "Position" des ActionListeners und des JTables wäre interessant.
Ich versuche jetzt mal eine Ferndiagnose...
... vielleicht erkennst Du ein paar Elemente deines Programmes wieder?
Wenn nicht: erklärst Du mal weiter, wie es in deinem Prog aussieht.
P.S. Du kannst mir auch einfach den gesammten SourceCode schicken :wink: (wird aber nicht mehr heute angeschaut) benjamin_sigg@gmx.ch
- Du hast ein HauptFenster (MainFrame), ein Dialog für die Eingabe (DatumInputDialog) oder was ähnliches.
Jetzt geht es darum, dass der ActionListener im DatumInputDialog an das Model, welches im MainFrame ist, herankommt.
- Dazu schreiben wir eine Methode im MainFrame, welche das Model des Tables zurückgibt.
- Dann sorgen wir dafür, dass der Dialog das MainFrame kennt. Dies machen wir über den Konstruktor, und der Variable "mainFrame" (im Dialog).
- Und nun kann ein ActionListener (der einen Button im Dialog belistenert) über das MainFrame zum Model kommen.
- Diese Kette von Aufrufen kann man natürlich beliebig auseinanderziehen und verzetteln. Aber die Infos die man bekommt sind immer aktuell.
Code:
// Das HauptFenster, in welchem der Verzeichnisbaum und die Tabelle angezeigt werden.
public class MainFrame extends JFrame{
private JTable table; // Das Table brauchen wir noch
private DatumInputDialog dialog = null; // Den speichern wir mal, sofern er später mal sichtbar gemacht werden soll
public MainFrame(){
dialog = new DatumInputDialog( this ); // neuer Dialog
table = new JTable(); // neues JTable
table.setModel( new FileTableModel() ); // Dem Table ein Model übergeben
... // was es sonst noch zu tun gibt
}
// Mit dieser Methode kann jeder das FileTableModel des JTable's erhalten.
public FileTableModel getModel(){
return (FileTableModel) table.getModel();
}
... // sonstige Methoden
}
Code:
// Ein Dialog mit einem TextFeld und einem "Ok"-Button
public class DatumInputDialog extends JDialog{
private MainFrame mainFrame;
public DatumInputDialog( MainFrame frame ){
super( frame, "Datum", true );
mainFrame = frame;
...
JButton okButton = new JButton( "OK");
okButton.addActionListener( new ActionListener(){
public void actionPerformed( ActionEvent e ){
double zahl = ... // die kann man vom TextFeld abholen
// Jetzt können wir auf das MainFrame zugreiffen, und so an das Model kommen
FileTableModel model = meinFrame.getModel();
// und bearbeiten
model.doSomething( zahl );
}
});
...
}
}
Ich habe dir mal den kompletten code als jave Datei geschickt.
Übrigens wollte ich nochmal schnell großen Dank an dich senden da ich gemerkt habe das du sehr vielen leuten hier hilfst und ich das total gut finde. DANKE
Übrigens wollte ich nochmal schnell großen Dank an dich senden da ich gemerkt habe das du sehr vielen leuten hier hilfst und ich das total gut finde. DANKE