jTable, spezille Zelle automatisch füllen

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

alle Guten Dinge sind Drei für einen Tag 😉


Das übliche jTable:
Code:
private JTable getTableColumns() {
		try{
		numberOfAttributes1 = getInt(enteredNumberOfAttributes.getText())+1;
		DefaultTableModel tableColumnsModel = 
				new DefaultTableModel(
						new String[numberOfAttributes1][numberOfAttributes1],
						new String[numberOfAttributes1] )
				        {
				        	public boolean isCellEditable(int row, int col)
				            {return row < col;
				            }
				        };

				        tableOfRelation = new JTable();
				        tableOfRelation.setModel(tableColumnsModel);
				        tableOfRelation.setTableHeader(null);
				        jScrollPane1.setViewportView(tableOfRelation);
			
				        for (int z = 1; z < numberOfAttributes1; z++)
				        {
				        	tableOfRelation.setValueAt("Attribut"+z,z,0);
				        	tableOfRelation.setValueAt("Attribut"+z,0,z);
				        }
				        
				        for (int i=1;i<numberOfAttributes1;i++)
				        {
				        	for (int j=1;j<numberOfAttributes1;j++) 
				        	{
				        	if(i==j)
				        		{
				        		tableOfRelation.setValueAt("1",i,j);
				        		}
				        }
				        	
            }
		return tableOfRelation;}
		catch(Exception e){return null;}
	}

Was ich nun machen möchte:
Wenn man was in die Zelle 01 einträgt, so soll das Selbe auch in Zelle 10stehen,...
Wenn man was in die Zelle 02 einträgt, so soll das Selbe auch in Zelle 20stehen,...
Wenn man was in die Zelle 03 einträgt, so soll das Selbe auch in Zelle 30stehen,...
usw.

Was müsste ich wie ändern? Eine Art Listener???


Danke und Gruß
 
Welchen Typ von Listener brauche ich denn da?
Könntest du mir bitte mal den Listener nennen,...


Danke
 
Leider steige ich da nicht wirklich durch:

Ich habe meiner Klasse nun wie folgt angepasst:
1.) hinzugefügt:
import javax.swing.event.*;
import javax.swing.table.TableModel;

2.) hinzugefügt:
implements TableModelListener

3.) hinzugefügt:
tableOfRelation.getModel().addTableModelListener(this);

4.) hinzugefügt:
Code:
    public void tableChanged(TableModelEvent e) {
        int row = e.getFirstRow();
        int column = e.getColumn();
        TableModel model = (TableModel)e.getSource();
        String columnName = model.getColumnName(column);
        Object data = model.getValueAt(row, column);

        // Do something with the data...

    }



Habe ich noch was "wichtiges" vergessen?

Wo muss ich jetzt wie ansetzten?
Denke mal bei :// Do something with the data... 😉
Müsste ich an diese Stelle schreiben, dass, wenn was ist 01 eingetragen wird er das auch in 10 schreiben soll?

Wie würde man das implementieren???

Danke
 
zunächst mal schreibst du da
System.out.println("Hello World");
oder auch
System.out.println("row, col, wert = "..);
um zu testen, ob es bisher funktioniert,

aber was ist da jetzt die Frage?
für das Setzen muss doch nur noch
model.setValueAt(column,row,data);
rein

nun aber die Endlosschleife: bei 01 wird 10 gesetzt,
bei 10 wird dann 01 gesetzt, bei 01 wieder 10 usw.,
deshalb prüfen, wo du dich gerade befindest

if (col ...
muss ich hoffentlich nicht einzeln erklären?
 
Also ein System.out.println funktioniert.
Wird aber dann direkt viermal ausgedruckt? Warum?

Wenn ich da nun zu Testzwecken sowas reinschreibe : model.setValueAt(3, 0, 3);
Dann erscheint der Wert 3 direkt, wenn die Tabelle aufgebaut wird - ich muss also nicht erst einen Wert in der Tabelle ändern.
Desweiteren bekomme ich auch eine Exception:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
at java.nio.CharBuffer.<init>(CharBuffer.java:259)
at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:52)
at java.nio.CharBuffer.wrap(CharBuffer.java:350)
at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:378)


Für weitere Hilfe wäre ich dankbar 🙂
 
> Wird aber dann direkt viermal ausgedruckt? Warum?

schaue dir das Event an, Typ, Parameter usw, im Zweifel ein vollständiges Test-Programm posten,
so dass andere das ausprobieren können

> Dann erscheint der Wert 3 direkt, wenn die Tabelle aufgebaut wird

du sollst den Befehlt in den Listener schreiben,

zur Exception fällt mir nix ein
-> im Zweifel ein vollständiges Test-Programm posten,
so dass andere das ausprobieren können
 
Hier mal die gekürzte Klasse mit allen "wichtigen" Sachen:

Code:
package gui;
import com.cloudgarden.layout.AnchorConstraint;
import com.cloudgarden.layout.AnchorLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import javax.swing.WindowConstants;
import javax.swing.table.DefaultTableModel;

import javax.swing.event.*;
import javax.swing.table.TableModel;


public class CreateRelation extends javax.swing.JFrame implements TableModelListener{
	private JTextField numberOfAttributes;
	private JTextField enteredNumberOfAttributes;
	private JButton createEndTable;
	private JButton exitCreateRelation;
	private JTable tableOfRelation;
	private JTextField separationField1;
	private JButton createFirstTable;
	private JScrollPane jScrollPane1;
	private int numberOfAttributes1;
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				CreateRelation inst = new CreateRelation();
				inst.setLocationRelativeTo(null);
				inst.setVisible(true);
			}
		});
	}

	public CreateRelation() {
		initGUI();
	}

	
	private void initGUI() {
		try {
			AnchorLayout thisLayout = new AnchorLayout();
			getContentPane().setLayout(thisLayout);
			getContentPane().setBackground(new java.awt.Color(180,200,235));
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
			{
				exitCreateRelation = new JButton();
				getContentPane().add(exitCreateRelation, new AnchorConstraint(825, 951, 894, 609, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				exitCreateRelation.setText("Abbrechen");
				exitCreateRelation.setPreferredSize(new java.awt.Dimension(171, 33));
				exitCreateRelation.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						dispose();
					}
				});
			}
			{
				createEndTable = new JButton();
				getContentPane().add(createEndTable, new AnchorConstraint(825, 427, 894, 51, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				createEndTable.setText("Relation anlegen");
				createEndTable.setPreferredSize(new java.awt.Dimension(188, 33));
				createEndTable.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
					}
				});
			}
			{
				jScrollPane1 = new JScrollPane();
				getContentPane().add(jScrollPane1, new AnchorConstraint(339, 950, 700, 50, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				jScrollPane1.setPreferredSize(new java.awt.Dimension(234, 74));
				jScrollPane1.setAutoscrolls(true);
				{
					tableOfRelation = getTableColumns();
					jScrollPane1.setViewportView(tableOfRelation);
				}
			}
			{
				separationField1 = new JTextField();
				getContentPane().add(separationField1, new AnchorConstraint(217, 1000, 296, 0, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				separationField1.setText("************************************************************************************");
				separationField1.setPreferredSize(new java.awt.Dimension(366, 22));
				separationField1.setBackground(new java.awt.Color(180,200,235));
				separationField1.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
				separationField1.setEditable(false);
			}
			{
				createFirstTable = new JButton();
				getContentPane().add(createFirstTable, new AnchorConstraint(57, 937, 124, 481, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				createFirstTable.setText("Tabelle erstellen");
				createFirstTable.setPreferredSize(new java.awt.Dimension(228, 32));
				createFirstTable.addMouseListener(new MouseAdapter() {
					public void mouseClicked(MouseEvent evt) {
						doReload();
					}
				});
			}
			{
				enteredNumberOfAttributes = new JTextField();
				getContentPane().add(enteredNumberOfAttributes, new AnchorConstraint(70, 415, 124, 319, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				enteredNumberOfAttributes.setPreferredSize(new java.awt.Dimension(48, 26));
			}
			{
				numberOfAttributes = new JTextField();
				getContentPane().add(numberOfAttributes, new AnchorConstraint(70, 319, 124, 59, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL));
				numberOfAttributes.setText("Anzahl der Attribute:");
				numberOfAttributes.setPreferredSize(new java.awt.Dimension(130, 26));
				numberOfAttributes.setBackground(new java.awt.Color(180,200,235));
				numberOfAttributes.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
				numberOfAttributes.setEditable(false);
			}
			setSize(500, 500);
		} catch (Exception e) {
			e.printStackTrace();
		}
			
	}
 
	public void doReload() {
		getTableColumns();
		}
	
	private JTable getTableColumns() {
		try{
		numberOfAttributes1 = getInt(enteredNumberOfAttributes.getText())+1;
		DefaultTableModel tableColumnsModel = 
				new DefaultTableModel(
						new String[numberOfAttributes1][numberOfAttributes1],
						new String[numberOfAttributes1] )
				        {
				        	public boolean isCellEditable(int row, int col)
				            {return row < col;
				            }

				        };

				        tableOfRelation = new JTable();
				        tableOfRelation.getModel().addTableModelListener(this);
				        tableOfRelation.setModel(tableColumnsModel);
				        tableOfRelation.setTableHeader(null);
				        jScrollPane1.setViewportView(tableOfRelation);
			
				        for (int z = 1; z < numberOfAttributes1; z++)
				        {
				        	tableOfRelation.setValueAt("Attribut"+z,z,0);
				        	tableOfRelation.setValueAt("Attribut"+z,0,z);
				        }
				        
				        for (int i=1;i<numberOfAttributes1;i++)
				        {
				        	for (int j=1;j<numberOfAttributes1;j++) 
				        	{
				        	if(i==j)
				        		{
				        		tableOfRelation.setValueAt("1",i,j);
				        		}
				        }
				        tableOfRelation.getModel().addTableModelListener(this);
				        	
            }
		return tableOfRelation;}
		catch(Exception e){return null;}
	}
	
	   public void tableChanged(TableModelEvent e) {
	        int row = e.getFirstRow();
	        int column = e.getColumn();
	        TableModel model = (TableModel)e.getSource();
	        String columnName = model.getColumnName(column);
	        Object data = model.getValueAt(row, column);

	        // Do something with the data...
	        System.out.println("Test neue Sache");
	        model.setValueAt(3, 0, 3);

	    }

    private int getInt (String number) {
        Integer i;
        i = Integer.valueOf(number);
        int giveBackInt = i.intValue();
        return giveBackInt;
     }
}
 
jetzt hast du es im Listener stehen und bekommst die Endlosschleife die ich schon zweimal beschrieben habe,
kommentiere ich diesen Befehl aus, kommt die andere Exception nicht,
aber ich musste auch alles zu den unbekannten Klassen AnchorConstraint & Co. auskommentieren,
hier im Forum kann man teilweise nur allgemeine Java-Dinge besprechen, keine Spezial-Frameworks..

ich kann 3x die Ausgabe "Test neue Sache" erkennen,
was klar ist, wenn in Zeile 162 3x setValueAt aufrufen wird (Anzahl Attribute 3),

Zeile 169 ist sehr übel, damit merkst du gar nicht, wenn du Exceptions bekommst,
z.B. wird initial in Zeile 81 getTableColumns(); aufgerufen,
zu diesem Zeitpunkt ist enteredNumberOfAttributes noch null
-> NullPointerException in Zeile 132
 
Sorry, dass ich noch weiter nachfragen muss... werde momentan nicht wirklich schlau aus deinen Antworten 🙁

1.) Habe ich es richtig verstanden, dass das "Grundgerüst" stimmt? (Also alles steht am rechten Platz?)
2.) Der aktuelle Fehler ist der, dass ich in eine Endlosschleife komme? An welcher Stelle müsste dann welche Überprüfung stehen?

Danke und Gruß

P.S.: Ziel ist es, die erste Zeile in die erste Spalte zu spiegeln (also automatisch versteht sich)
 
SlaterB hat gesagt.:
nun aber die Endlosschleife: bei 01 wird 10 gesetzt,
bei 10 wird dann 01 gesetzt, bei 01 wieder 10 usw.,
deshalb prüfen, wo du dich gerade befindest
wenn du nun nicht selber drauf kommst, wi du column + row prüfen musst,
ja dann eben nicht, dann kannst du das halt nicht programmieren,
ich mache es nicht..
 
an welcher stelle muss den diese prüfung stehen?
in welche zeile soll ich die überprüfung setzten?

könntest du mir das noch beantworten?

wäre super.

danke
 
denk doch nicht nicht in Zeilen,
du hast einen Listener, der eine Aktion ausführen soll, aber nur für bestimmte Ereignisse,
also irgendwo im Listener
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben