Swing Logikaufgabe: Zeilenanzahl einer JTable mit 3d String dynamisch anpassen

Andireas99

Mitglied
Hallo zusammen

Ich lese aus Dateien Daten in Tabellen ein. Jedoch sind in nicht jeder Datei gleich viel Zeilen, also braucht es auch Tabellen mit verschiesen vielen Zeilen. Bis jetzt habe ich die ganzen Daten in einen 3d String eingelesen, um von dort dann mit
Java:
table[a-1] = new JTable(data[a-1],title);
die Daten in die Tabelle zu bekommen. Doch jetzt das Problem: Ich muss bevor ich die Daten in den 3d String mache, muss ich definieren wie gross er sein soll, also in meinem Fall:
Java:
String[][][] data = new String[direct-1][10][4];
So habe ich also definiert, dass es 10 Zeilen hat. So muss aber jede Tabelle 10 Zeilen haben und kann nicht mehr oder weniger haben. Auch für jede einzulesende Datei einen eigenen String zu erstellen ist eine schlechte Idee, da es dann ziehmlich viele werden 😀.


Wie kann ich es sonst lösen???

Der Code:
Java:
public Tabelle(){
		
		super();
		onCreate();
		int a = 1;
		JPanel platte = new JPanel();
		platte.setPreferredSize(new Dimension(500,1000));
		
		String[] herausleser = new String[4];
		super.setLayout(new FlowLayout());
		super.setBorder(BorderFactory.createEtchedBorder());
		File file = new File("");
		
		
		int direct = 1;
		File directory = new File("");
		for(directory = new File("/Users/name/Documents/ordner1/"+direct+".txt");directory.exists();){
			direct++;
			directory = new File("/Users/name/Documents/ordner1/"+direct+".txt");
			
		}
		String[][][] data = new String[direct-1][10][4];
		JTable[] table = new JTable[direct-1];
		
			for(file =new File("/Users/name/Documents/ordner1/"+a+".txt");file.canRead() && file.isFile() && file.exists();){
				
				
				try {
					BufferedReader in = new BufferedReader(new FileReader(file));
					String zeile = null;
					int b = 1;
					
					while ((zeile = in.readLine()) != null) {
						
						if(b > 2){
							herausleser = zeile.split("\\*");
							for(int c=0;c<herausleser.length;c++){
								data[a-1][b-3][c] = herausleser[c];
								
							}
						}
						
						b++;
					}
					
					table[a-1] = new JTable(b,4);
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				
				
				String[] title = new String[]{" "," "," "," "};
				
				Color bg = new Color(162,205,90);
				table[a-1] = new JTable(data[a-1],title);
				table[a-1].setBackground(bg);
				table[a-1].setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
				
				TableColumn col1 = table[a-1].getColumnModel().getColumn(0);
				col1.setPreferredWidth(200);
				TableColumn col2 = table[a-1].getColumnModel().getColumn(2);
				col2.setPreferredWidth(150);
				TableColumn col3 = table[a-1].getColumnModel().getColumn(3);
				col3.setPreferredWidth(200);

				platte.add(table[a-1]);
				
				a++;
				file =new File("/Users/name/Documents/ordner1/"+a+".txt");
			}
			super.setPreferredSize(new Dimension(650,650));
			JScrollPane scrollPane = new JScrollPane (platte, 
		            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
		            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
			scrollPane.setPreferredSize(new Dimension(650,650));
			
			super.add(scrollPane);
			
		}


Ich danke euch! :toll:
Freundliche Grüsse Andreas
 
Für dein Problem sind arrays villeicht nicht ganz das richtige instrument...

Galileo Computing :: Java ist auch eine Insel – 13.3 Listen

in Java gibt es listen, das sind vereinfacht gesagt arrays mit dynamischer größe.

Um deine liste nun in die Tabelle zu bekommen solltest du dir das hier mal anschauen:

How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

und insbesondere das DefaulTtableModel. das hat eine "addrow" funktion mit der du zur laufzeit die zeilenanzahl einer JTable erhöhen kannst

DefaultTableModel (Java Platform SE 7 ))
 
Vielen Dank für deine Links! Hier habe ich durch Zufall noch ein sehr ähnliches problem gefunden: Datenaufbereitung über JTabbedPane, JList und JTable - Tutorial | IT blogging

Aber ich habe es trotzdem mit arrays gelöst. Ich habe eine Funktion geschrieben, welche eine Datei ausliest und die Daten in die Tabelle bringt, dabei wird der Array immer an die jetztige datei angepasst. Hier noch der Code:
Java:
public Tabelle(){
		
		super();
		onCreate();
		int a = 1;
		JPanel platte = new JPanel();
		platte.setPreferredSize(new Dimension(500,1000));
		
		String[] herausleser = new String[4];
		super.setLayout(new FlowLayout());
		//super.setBorder(BorderFactory.createEtchedBorder());
		File file = new File("");
		
		
		int direct = 1;
		File directory = new File("");
		for(directory = new File("/Users/name/Documents/ordner1/"+direct+".txt");directory.exists();){
			direct++;
			directory = new File("/Users/name/Documents/ordner1/"+direct+".txt");
			
		}
		
			for(file =new File("/Users/name/Documents/ordner1/"+a+".txt");file.canRead() && file.isFile() && file.exists();){
				int b = 1;
				try {
					BufferedReader in = new BufferedReader(new FileReader(file));
					String zeile = null;
					while ((zeile = in.readLine()) != null) {
						
						
						if(b > 2){
							herausleser = zeile.split("\\*");
							for(int c=0;c<herausleser.length;c++){
								
								
							}
						}
						
						b++;
					}
					
					
				} catch (IOException e) {
					e.printStackTrace();
				}
				
				lese(file,a,b,direct,platte);
				
				a++;
				file =new File("/Users/name/Documents/ordner1/"+a+".txt");
			}
			super.setPreferredSize(new Dimension(650,650));
			JScrollPane scrollPane = new JScrollPane (platte, 
		            ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
		            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
			scrollPane.setPreferredSize(new Dimension(650,650));
			
			super.add(scrollPane);
			
		}
	//
	public void lese(File file, int a,int d, int direct,JPanel platte){
		
		String zeile = null;
		int b = 1;
		String[] title = new String[]{" "," "," "," "};
		Color bg = new Color(162,205,90);
		JTable[] table = new JTable[direct-1];
		String[][] daten = new String[d-3][4];
		String[] herausleser = new String[3];
		try {
			BufferedReader in = new BufferedReader(new FileReader(file));
			while ((zeile = in.readLine()) != null) {
				
				if(b > 2){
					herausleser = zeile.split("\\*");
					for(int c=0;c<herausleser.length;c++){
						daten[b-3][c] = herausleser[c];
						
					}
				}
				
				b++;
			}
			
			table[a-1] = new JTable(b-3,4);
		} catch (IOException e) {
			e.printStackTrace();
		}
		table[a-1] = new JTable(daten,title);
		table[a-1].setBackground(bg);
		table[a-1].setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		
		
		TableColumn col1 = table[a-1].getColumnModel().getColumn(0);
		col1.setPreferredWidth(200);
		TableColumn col2 = table[a-1].getColumnModel().getColumn(2);
		col2.setPreferredWidth(150);
		TableColumn col3 = table[a-1].getColumnModel().getColumn(3);
		col3.setPreferredWidth(200);
		platte.add(table[a-1]);
		
	}

Ist vllt nicht der schönste Code aber er funktioniert. 😀

Freundliche Grüsse
Andreas
 

Zurück
Oben