Zugriff auf Variable einer Klasse - komplex!

Raetsel

Grünschnabel
Hi !

Ich hab da bestimmt ne richtig einfache Frage, für Leute die schon etwas länger dabei sind. Und zwar hab ich zwei Klassen und möchte in der einen auf die andere zugreifen. Also in meinem Hauptframe, hab ich ein JTable, das Buttons besitzt, in der Klasse Button werden die Buttons erstellt und deshalb ist dort auch der Actionlistener gesetzt. Jeder Button hat eine bestimmte Aufgabe, nämlich eine Zeile bzw. Spalte zu addieren, jetzt muss ich ja dem Actionlistener sagen bzw. dem Button auf welche Reihe und Spalte er da zugreifen soll.
Wie organisiere ich da den Import in der Klasse Buttons? Wie bekomme ich es hin, dass dort die Spalten gekannt werden?

Ich poste mal den Code der Klassen:
Code:
// Testklasse.java 


import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 

import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 



public class Testklasse extends JFrame implements ActionListener 
{ 
private class MeinWindowListener extends WindowAdapter 
{ 

	 public void windowClosing(WindowEvent arg0) 
	 { 
		 System.exit(0); 
	 } 
} 

private int cellVal1[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; 
   private int cellVal2[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; 
   private int cellVal3[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; 
   private int cellVal4[] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; 
   private int sumVal[] = {0,0,0,0}; 
   private DefaultTableModel tableModelButton; 
   private DefaultTableModel tableModelAuto; 
   private JComponent jc = (JComponent)getContentPane(); 
   private DefaultTableModel tableModelSumme; 
	
   Testklasse() 
   { 
	   super("Testklasse"); 
		   setTitle("Bla"); 
		   setSize(800, 500);		
		   initLayout(); 
		   setLocationRelativeTo(null); 
		   addWindowListener(new MeinWindowListener()); 
		   setVisible(true); 
		   setResizable(true);		
	} 
	void initLayout() 
	   { 
		  jc.setLayout( new BorderLayout( ) ); 
	   
	   
		  String[] columnNamenSpieler = { "Auto 1", "Auto 2", "Auto 3", "Auto 4"}; 
		  String[] columnNamenStartwerte = { "", "", "", ""}; 
		   
		   String[] columnNameWurf = { "Fahrzeug"}; 
		   Object[][] spalteWuerfe = { 
			   { "Kategorie 1"}, 
			   { "Kategorie 2"}, 
			   { "Kategorie 3"}, 
			   { "Kategorie 4"}, 
			   { "Kategorie 5"}, 
			   { "Kategorie 6"}, 
			   { "Kategorie 7"}, 
			   { "Kategorie 8"}, 
			   { "Kategorie 9"}, 
			   { "Kategorie 10"}, 
			   { "Kategorie 11"}, 
			   { "Kategorie 12"}, 
			   { "Kategorie 13"} 
		 }; 
		   
		   Object[][] autoDaten = { 
			   { new Integer(cellVal1[0]), new Integer(cellVal2[0]), new Integer(cellVal3[0]), new Integer(cellVal4[0]) }, 
			   { new Integer(cellVal1[1]), new Integer(cellVal2[1]), new Integer(cellVal3[1]), new Integer(cellVal4[1]) }, 
			   { new Integer(cellVal1[2]), new Integer(cellVal2[2]), new Integer(cellVal3[2]), new Integer(cellVal4[2]) }, 
			   { new Integer(cellVal1[3]), new Integer(cellVal2[3]), new Integer(cellVal3[3]), new Integer(cellVal4[3]) }, 
			   { new Integer(cellVal1[4]), new Integer(cellVal2[4]), new Integer(cellVal3[4]), new Integer(cellVal4[4]) }, 
			   { new Integer(cellVal1[5]), new Integer(cellVal2[5]), new Integer(cellVal3[5]), new Integer(cellVal4[5]) }, 
			   { new Integer(cellVal1[6]), new Integer(cellVal2[6]), new Integer(cellVal3[6]), new Integer(cellVal4[6]) }, 
			   { new Integer(cellVal1[7]), new Integer(cellVal2[7]), new Integer(cellVal3[7]), new Integer(cellVal4[7]) }, 
			   { new Integer(cellVal1[8]), new Integer(cellVal2[8]), new Integer(cellVal3[8]), new Integer(cellVal4[8]) }, 
			   { new Integer(cellVal1[9]), new Integer(cellVal2[9]), new Integer(cellVal3[9]), new Integer(cellVal4[9]) }, 
			   { new Integer(cellVal1[10]), new Integer(cellVal2[10]), new Integer(cellVal3[10]), new Integer(cellVal4[10]) }, 
			   { new Integer(cellVal1[11]), new Integer(cellVal2[11]), new Integer(cellVal3[11]), new Integer(cellVal4[11]) }, 
			   { new Integer(cellVal1[12]), new Integer(cellVal2[12]), new Integer(cellVal3[12]), new Integer(cellVal4[12]) } 
		   }; 
		   
		   for (int i = 0; i< 6; i++) 
		   { 
			  cellVal1[i] = (i+1)*10 +1; 
			cellVal2[i] = (i+1)*10 +2; 
			sumVal[0] = sumVal[0]+cellVal1[i]; 
			sumVal[1] = sumVal[1]+cellVal2[i]; 
			sumVal[2] = sumVal[2]+cellVal3[i]; 
			sumVal[3] = sumVal[3]+cellVal4[i]; 
			 
			Object[][] sumData = 
			{ 
				  { new Integer(sumVal[0]), new Integer(sumVal[1]), new Integer(sumVal[0]), new Integer(sumVal[1])} 
				  }; 
		   tableModelButton = new DefaultTableModel(spalteWuerfe, columnNameWurf) 
		 { 

			public int getRowCount() 
			{ 
			   return 13; 
			} 
		   }; 
		 tableModelAuto = new DefaultTableModel(autoDaten, columnNamenSpieler ); 
		  
		 JTable tableButton = new JTable(tableModelButton) 
		 { 
			public Class getColumnClass(int column) 
			{ 
			return getValueAt(0, column).getClass(); 
			  } 
		   }; 
	  tableModelSumme = new DefaultTableModel(sumData, columnNamenSpieler ); 
	  JTable tableSumData = new JTable(tableModelSumme); 
	  ButtonColumn buttonColumn = new ButtonColumn(tableButton, 0); 

	  tableButton.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
	  tableButton.getColumn( "Fahrzeug" ).setPreferredWidth(  120 ); 
	   
	  JTable tableAuto = new JTable(tableModelAuto); 
	  tableAuto.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
	
	  JTable tableSumme = new JTable(tableModelSumme); 
	  tableAuto.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
	  tableSumme.setAutoResizeMode( JTable.AUTO_RESIZE_OFF ); 
	   
	  JScrollPane scrollButton = new JScrollPane(tableButton); 
	  scrollButton.setPreferredSize(new Dimension(123,108)); 
	   
	  JScrollPane scrollAuto = new JScrollPane (tableAuto); 
	  scrollAuto.setPreferredSize(new Dimension(263,208)); 
	   
	  JScrollPane scrollSumme = new JScrollPane (tableSumme); 
	  scrollSumme.setPreferredSize(new Dimension(263,15)); 
	  // 
	  JPanel westPnl = new JPanel(); 
	  Box box1 = new Box(BoxLayout.X_AXIS); 
	  box1.add(scrollButton); 
	  Box box2 = new Box(BoxLayout.X_AXIS); 
	  box2.add(scrollAuto); 
	  Box box3 = new Box(BoxLayout.X_AXIS); 
	  box3.add(scrollSumme); 
	  westPnl.setLayout(new BoxLayout(westPnl, BoxLayout.X_AXIS)); 
	  westPnl.add(box1); 
	  westPnl.add(box2); 
	  westPnl.add(box3); 
	  jc.add("West", westPnl); 
		   } 
	   } 
	public void actionPerformed(ActionEvent e) 
	   { 
		
	   } 
	public static void main(String[] args) 
	{ 
	  Testklasse frame = new Testklasse(); 
	  frame.setSize(800, 500); 
	  frame.setLocationRelativeTo(null); 
	  frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
	  //frame.pack(); 
	  frame.setVisible(true); 
	} 
}

Code:
// ButtonColumn.java 2. Klasse 

import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.AbstractCellEditor; 
import javax.swing.JButton; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.table.TableCellEditor; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumnModel; 
   class ButtonColumn extends AbstractCellEditor implements TableCellRenderer, 
   TableCellEditor, ActionListener { 

JTable table; 

JButton renderButton; 

JButton editButton; 

String text; 

public ButtonColumn(JTable table, int column) { 
   super(); 
   this.table = table; 
   renderButton = new JButton(); 

   editButton = new JButton(); 
   editButton.setFocusPainted(false); 
   editButton.addActionListener(this); 

   TableColumnModel columnModel = table.getColumnModel(); 
   columnModel.getColumn(column).setCellRenderer(this); 
   columnModel.getColumn(column).setCellEditor(this); 
} 

public Component getTableCellRendererComponent(JTable table, 
	  Object value, boolean isSelected, boolean hasFocus, int row, 
	  int column) { 
   if (isSelected) { 
	  renderButton.setForeground(table.getSelectionForeground()); 
	  renderButton.setBackground(table.getSelectionBackground()); 
   } else { 
	  renderButton.setForeground(table.getForeground()); 
	  renderButton.setBackground(UIManager 
			.getColor("Button.background")); 
   } 

   renderButton.setText((value == null) ? "" : value.toString()); 
   return renderButton; 
} 

public Component getTableCellEditorComponent(JTable table, 
	  Object value, boolean isSelected, int row, int column) { 
   text = (value == null) ? "" : value.toString(); 
   editButton.setText(text); 
   return editButton; 
} 


public Object getCellEditorValue() { 
   return text; 
} 


public void actionPerformed(ActionEvent e) 
   { 
   int row = table.getSelectedRow(); 

   System.out.print(e.getActionCommand()+" " + "\n"); 
  
   // hier soll jetzt die Addition durchgeführt werden dazu muss ich auf 
   // die ScrollAuto zugreifen wie mach ich das an dieser Stelle? 
	
   // wie bekomme ich Zugriff auf diese Zeile aus der Testklasse? 
	
   /**System.out.print(cellVal1[row]); 
   System.out.print(sumVal[1]);*/ 
   } 
}
So ganz konkret jetzt gefragt, wie greife ich z.B auf
cellVal1[row] zu, aus der Klasse Testklasse hier in meiner ButtonColumnklasse?


--> zieht euch die Klassen ruihg rüber, sie laufen einwandfrei, vielleicht versteht ihr dann besser was ich meine!
 
Moin,
zwei Dinge:
1. Warum legst Du de Buttons nicht in die Frame-Klasse? Da sie GUI-Elemente auf dem Frame sind, gehören sie auch in die Klasse. Dann könntest Du auch direkt auf die gewünschten Variablen zugreifen.
2. Ich würde die Actions/Buttons anders aufbauen. Für jede Kategorie einen eigenen Button mit eigenem ActionListener scheint mir nicht sonderlich clever. Wie wäre da eher ein Button im Zusammenspiel mit einer Combobox, in der die Kategorienummern ausgewählt werden können? Dann beim actionPerformed() des Buttons die Kategorienummer auslesen und entsprechend reagieren.
 
Hallo du

Du musst die Variablen global definieren

d.h

public class Testklasse .....
{
public static int cellVal1[];
public static int cellVal2[];

//Wichtig: Die Variablen dürfen nicht innerhalb einer Methode deklariert werden da Sie sonst nur innerhalb dieser Methode existieren

//weiterer Code
} //Ende der Klasse
 
eine möglichkeit wären z.B getter und setter methoden....
musst nur dafuer sorger das sich die klassen auch kennen aber das sollte ja kein Problem sein..
könnten z.B. dem Konstruktor deiner ButtonColumn Klasse ne refernz auf die testklasse übergeben..

btw. verstehe auch nicht ganz wieso du die Klasse so aufgebaut hast.. glaub haette das anders gemacht
 
Zuletzt bearbeitet:
RMI_17 hat gesagt.:
Hallo du

Du musst die Variablen global definieren

d.h

public class Testklasse .....
{
public static int cellVal1[];
public static int cellVal2[];

Aua aua.
Dieser Programmier"stil" ist bedauerlicherweise häufig von autodidaktischen C++ Programmieren zu sehen, denen OOP nicht so recht vertraut ist.
ralle deutet es schon richtig an:
Idealerweise - natürlich gibt es auch hierzu Ausnahmen - werden Variablen mit der Sichtbarkeit private angelegt plus dazugehörige getter- und setter-Methoden, über die dann zugegriffen werden kann. Direktzugriff auf Variablen ist in OO/Java-Kreisen eher verpönt.
 
Naja.

Ich habe meinen Java kurs erst im September und studiert hab ich auch noch!! nicht.

Ich war nur 2Jahre an der HTL für Betriebsinformatik (--> die Lehrer dort sind froh wenn sie eine HelloWorld ausgabe hinbekommen ohne Handbuch)

Also lerne ich mir Java selber. Also für das dass ich es mir selber lerne kann ich es schon super. Und ich habe ja auch noch keine Übung und so. Ich habe vorher nur mit VB.net und so gearbeitet und Java ist mir völlig neu und spezielle Syntax kann man sich nicht selber lernen.

Naja werds schon noch hinbekommen
 
In "Java ist auch eine Insel" ist das Geheimnisprinzip kurz aufgeführt und erläutert im Kapitel 6.3.
Wenn du mehr zum Thema wissen möchtest kanns ja einfach nach "Geheimnisprinzip" und "OOP" googeln.. findest direkt ne menge präsis von vorlesungen etc wenn interesse besteht.

würde empfehlen sich daran zu halten da es bei komplexeren programme ne menge ärger spart wenn man sich drah hält ^^
 
Zurück