Spaltenbreite manuell anpassen bei einer JTable (wie bei.)

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

Guest

Gast
Hallo, ich habe eine hoffentlich einfache Frage !

Also, ich habe eine JTable, mit mehreren Spalten.
Ich will, dass man die Spaltenbreite manuell mit der Maus im Programm anpassen kann, wie bei Excel !

Wie bekomme ich das hin ?

Danke im vorraus !!
 
manuell mit der Maus anpassen kann

Beweg doch einfach den Mauszeiger (langsam) zwischen die Header der Tabelle.
Dann kannst du (nach Mausklick und festhalten) die Breiten doch einfach mit
der Maus verändern.

Oder was willst du? ???:L
 
Leroy42a hat gesagt.:
manuell mit der Maus anpassen kann

Beweg doch einfach den Mauszeiger (langsam) zwischen die Header der Tabelle.
Dann kannst du (nach Mausklick und festhalten) die Breiten doch einfach mit
der Maus verändern.

Oder was willst du? ???:L

Nein das kann ich leider nicht 🙁

Hier mal der Code :

Code:
import javax.swing.*;
import javax.swing.JTable.PrintMode;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class KundeSuchen extends JPanel 
                         implements ActionListener
{
	

 
	 private DvdGui parent;
	 
	 private JTextField tf1          = new JTextField ();  
	 private JTextField tf2          = new JTextField (); 
	 
	 private JLabel l1       = new JLabel("Nachname eingeben: "); 
	 private JLabel l2       = new JLabel("Vorname  eingeben: "); 
	 private JLabel l7 		 = new JLabel(" Kunden - Suche ");
	 
	 private JButton btnSU = new JButton("  Suchen  ");
	 private JButton btnNEW = new JButton("  Neu  ");
	 private JButton btnABBRECHEN = new JButton("  Schließen  ");
	 
	 private String s1 = "";
	 private String s2 = "";
	 
	 private JButton btschließen = new JButton("  Schließen  ");
	 private JButton btsuche_neu = new JButton("  Neue Suche  ");
	 private JButton btsuche = new JButton("  Suchen  ");
 
	 private JTextField suche = new JTextField("Bitte Suche eingeben...");

 	private JLabel überschrift = new JLabel("Kunde suchen...");
 	private JLabel Fehler = new JLabel("");

 	private String ssuche = "";
 	private String kunde[][];

 
 Font f = new Font("Comic Sans MS", Font.ITALIC, 16);
 Font f1 = new Font("Comic Sans MS", Font.ITALIC, 22);
 
 String columnNames[] ={"Kunden-ID", "Name", "Vorname", "Straße", "Hausnummer","PLZ","Ort","Telefonnummer","e-Mailadresse","Geburtsdatum","Personalausweis-ID"};

 
 DefaultTableModel model = new DefaultTableModel(kunde, columnNames)
 {
     public boolean isCellEditable(int row, int col) 
     {
     return(true);
     }
  };
	private JTable tablesuche = new JTable( model );
	
	public KundeSuchen(DvdGui parent)
 {
		this.parent = parent;
		setLayout(null);
		
		//tablesuche.setBounds 	(new Rectangle(100,300,800,300));
		tf1.setBounds 			(new Rectangle(500,180,250,21));  
		tf2.setBounds 			(new Rectangle(500,200,250,21)); 
		l7.setBounds  			(new Rectangle(375,80,250,25));
		Fehler.setBounds		(new Rectangle(20,550,700,21));
		l1.setBounds  			(new Rectangle(250,180,210,21)); 
		l2.setBounds  			(new Rectangle(250,200,210,21));		
		btnSU.setBounds			(new Rectangle(300,250,120,21));
		btnNEW.setBounds		(new Rectangle(450,250,120,21));
		btnABBRECHEN.setBounds	(new Rectangle(600,250,120,21));
		
		Font f = new Font("Comic Sans MS", Font.ITALIC, 16);
		l1.setFont(f);
		l2.setFont(f);
		Font f1 = new Font("Comic Sans MS", Font.ITALIC, 22);
		l7.setFont(f1);
		
		add(l1);
		add(l2);
		add(l7);
		add(tf1);
		add(tf2);
		add(btnSU);
		add(btnNEW);
		add(btnABBRECHEN);
		add(Fehler);
		
		btnSU.addActionListener(this);
	 	btnNEW.addActionListener(this);
	 	btnABBRECHEN.addActionListener(this);
	 	
	    tablesuche.getTableHeader().setReorderingAllowed(false);
	    tablesuche.getTableHeader().setResizingAllowed(false);
	    JScrollPane scrollbar = new JScrollPane(tablesuche);
        scrollbar.setViewportView(tablesuche);
        tablesuche.setModel(model);
        scrollbar.setVisible(true);
        scrollbar.setBounds(50,300,900,300);
        add(scrollbar);
       // add(tablesuche);

 }

public void actionPerformed(ActionEvent e)
{ 
	 if(e.getSource()== btnABBRECHEN)
		 {
			 parent.jtp.remove(this);
			 parent.pack();
			 parent.setExtendedState(JFrame.MAXIMIZED_BOTH);
		 }                   
	 if(e.getSource()== btnNEW)
	  	{
		 tf1.setText("");
		 tf2.setText("");
	  	}
		if(e.getSource()== btnSU){
			Connection conn = null; //Verbindung zum Server
			Statement stmt = null;  //die abzusetzende SQL-Anweisung
			ResultSet rs = null;    //die empfangenen Daten
			int index1 = 0;
			//ResultSet rs2 = null;    //die empfangenen Daten
			 try{
				 s1 = tf1.getText();
				 s2 = tf2.getText();
			 }
			 catch (Exception ex)
			 {
			 	Fehler.setText("Fehler: " + ex.toString()); 
			 }

			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance();
				Fehler.setText("Treiber OK.");
				conn = DriverManager.getConnection("jdbc:mysql://10.30.0.201/dvdverleih?user=software&password=verleih");
				Fehler.setText("Verbindung erhalten: " + conn.toString());
			}
			catch (Exception exe)
			{
				Fehler.setText("Fehler beim Verbindungsaufbau!" + exe.toString()); 
			}
			
			try
			{
				stmt = conn.createStatement();
				if(s1==null){ s1 = "%";}
				if(s2==null){ s2 = "%";}
				rs = stmt.executeQuery("SELECT * FROM kunde WHERE name LIKE '%"+s1+"%' AND vorname LIKE '%"+s2+"%';");
				
		        rs.last();
		        int rows = rs.getRow();
		        rs.beforeFirst();
		        kunde = new String[rows][11];
		        //System.out.println(rows);
		        while (rs.next()){
		          // Alle Kundenangaben laufen hier durch
		        	for(int i=0;i<11;i++)
		        	{
		        	kunde[index1][i] = rs.getString(i+1);
		        	System.out.println(kunde[index1][i]);
		        	}
		            index1++;		         
		        }
		        model.setDataVector(kunde, columnNames);
		        model.fireTableDataChanged();
			}
			
			catch(Exception exep)
			{
				Fehler.setText("Fehler beim Suchen: " + exep.toString());
			}
			
		 }


				
		}
}

Bitte hilft mir =D
 
Das DefaultTableModel erlaubt doch die Spaltenvergrößerung :shock:

Ich kann deinen Code im Moment nicht kompilieren, da auf meinem
Ersatzrechner noch nichts installiert ist 🙁

Also weiter auf Antworten warten.
 
Es geht aber nicht 🙁
Aber danke für deine Antworten. Ich hoffe dass mir bis morgen geholfen wird..
 
Weiß niemand weiter ? Ich sitz schon seit 2 Tagen an diesem Problem :?
 
Inzwischen bin ich so verzweifelt dass ich glaube dass es keine Lösung dafür gibt.
Ich hasse es einfach !!!! :?
Wie schrecklich Programmierung sein kann .....
 
Anonymous hat gesagt.:
Inzwischen bin ich so verzweifelt dass ich glaube dass es keine Lösung dafür gibt.
Ich hasse es einfach !!!! :?
Wie schrecklich Programmierung sein kann .....

...nun, es ist noch kein Guru vom Himmel gefallen!
Beim Programmieren gelten vor allem 3 Dinge:
  • Gehirn einschalten und über die Problemlösung nachdenken
  • Entwicklung des Lösungsalgorythmus
  • Testen, Testen, Testen, Testen, usw. usv.

..den ein Programm ist nicht das was Du oder wer auch immer willst, sondern das was Du schreibst!
Ergo macht der Hobel immer nur das was Du Ihm sagst! 😉

mfg
DOcRandom
 
Kann ich es auch hinbekommen dass eine markierte spalte einer JTable eine Farbe bekommt ? Und dann man die Spaltenbreite mit einem Doppelklick optimieren kann ?
 
Anonymous hat gesagt.:
Leroy42a hat gesagt.:
manuell mit der Maus anpassen kann

Beweg doch einfach den Mauszeiger (langsam) zwischen die Header der Tabelle.
Dann kannst du (nach Mausklick und festhalten) die Breiten doch einfach mit
der Maus verändern.

Oder was willst du? ???:L

Nein das kann ich leider nicht 🙁

Hier mal der Code :

Code:
import javax.swing.*;
import javax.swing.JTable.PrintMode;
import javax.swing.table.DefaultTableModel;

import java.awt.*;
import java.awt.event.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class KundeSuchen extends JPanel 
                         implements ActionListener
{
	

 
	 private DvdGui parent;
	 
	 private JTextField tf1          = new JTextField ();  
	 private JTextField tf2          = new JTextField (); 
	 
	 private JLabel l1       = new JLabel("Nachname eingeben: "); 
	 private JLabel l2       = new JLabel("Vorname  eingeben: "); 
	 private JLabel l7 		 = new JLabel(" Kunden - Suche ");
	 
	 private JButton btnSU = new JButton("  Suchen  ");
	 private JButton btnNEW = new JButton("  Neu  ");
	 private JButton btnABBRECHEN = new JButton("  Schließen  ");
	 
	 private String s1 = "";
	 private String s2 = "";
	 
	 private JButton btschließen = new JButton("  Schließen  ");
	 private JButton btsuche_neu = new JButton("  Neue Suche  ");
	 private JButton btsuche = new JButton("  Suchen  ");
 
	 private JTextField suche = new JTextField("Bitte Suche eingeben...");

 	private JLabel überschrift = new JLabel("Kunde suchen...");
 	private JLabel Fehler = new JLabel("");

 	private String ssuche = "";
 	private String kunde[][];

 
 Font f = new Font("Comic Sans MS", Font.ITALIC, 16);
 Font f1 = new Font("Comic Sans MS", Font.ITALIC, 22);
 
 String columnNames[] ={"Kunden-ID", "Name", "Vorname", "Straße", "Hausnummer","PLZ","Ort","Telefonnummer","e-Mailadresse","Geburtsdatum","Personalausweis-ID"};

 
 DefaultTableModel model = new DefaultTableModel(kunde, columnNames)
 {
     public boolean isCellEditable(int row, int col) 
     {
     return(true);
     }
  };
	private JTable tablesuche = new JTable( model );
	
	public KundeSuchen(DvdGui parent)
 {
		this.parent = parent;
		setLayout(null);
		
		//tablesuche.setBounds 	(new Rectangle(100,300,800,300));
		tf1.setBounds 			(new Rectangle(500,180,250,21));  
		tf2.setBounds 			(new Rectangle(500,200,250,21)); 
		l7.setBounds  			(new Rectangle(375,80,250,25));
		Fehler.setBounds		(new Rectangle(20,550,700,21));
		l1.setBounds  			(new Rectangle(250,180,210,21)); 
		l2.setBounds  			(new Rectangle(250,200,210,21));		
		btnSU.setBounds			(new Rectangle(300,250,120,21));
		btnNEW.setBounds		(new Rectangle(450,250,120,21));
		btnABBRECHEN.setBounds	(new Rectangle(600,250,120,21));
		
		Font f = new Font("Comic Sans MS", Font.ITALIC, 16);
		l1.setFont(f);
		l2.setFont(f);
		Font f1 = new Font("Comic Sans MS", Font.ITALIC, 22);
		l7.setFont(f1);
		
		add(l1);
		add(l2);
		add(l7);
		add(tf1);
		add(tf2);
		add(btnSU);
		add(btnNEW);
		add(btnABBRECHEN);
		add(Fehler);
		
		btnSU.addActionListener(this);
	 	btnNEW.addActionListener(this);
	 	btnABBRECHEN.addActionListener(this);
	 	
	    tablesuche.getTableHeader().setReorderingAllowed(false);
	    tablesuche.getTableHeader().setResizingAllowed(false);
	    JScrollPane scrollbar = new JScrollPane(tablesuche);
        scrollbar.setViewportView(tablesuche);
        tablesuche.setModel(model);
        scrollbar.setVisible(true);
        scrollbar.setBounds(50,300,900,300);
        add(scrollbar);
       // add(tablesuche);

 }

public void actionPerformed(ActionEvent e)
{ 
	 if(e.getSource()== btnABBRECHEN)
		 {
			 parent.jtp.remove(this);
			 parent.pack();
			 parent.setExtendedState(JFrame.MAXIMIZED_BOTH);
		 }                   
	 if(e.getSource()== btnNEW)
	  	{
		 tf1.setText("");
		 tf2.setText("");
	  	}
		if(e.getSource()== btnSU){
			Connection conn = null; //Verbindung zum Server
			Statement stmt = null;  //die abzusetzende SQL-Anweisung
			ResultSet rs = null;    //die empfangenen Daten
			int index1 = 0;
			//ResultSet rs2 = null;    //die empfangenen Daten
			 try{
				 s1 = tf1.getText();
				 s2 = tf2.getText();
			 }
			 catch (Exception ex)
			 {
			 	Fehler.setText("Fehler: " + ex.toString()); 
			 }

			try
			{
				Class.forName("com.mysql.jdbc.Driver").newInstance();
				Fehler.setText("Treiber OK.");
				conn = DriverManager.getConnection("jdbc:mysql://10.30.0.201/dvdverleih?user=software&password=verleih");
				Fehler.setText("Verbindung erhalten: " + conn.toString());
			}
			catch (Exception exe)
			{
				Fehler.setText("Fehler beim Verbindungsaufbau!" + exe.toString()); 
			}
			
			try
			{
				stmt = conn.createStatement();
				if(s1==null){ s1 = "%";}
				if(s2==null){ s2 = "%";}
				rs = stmt.executeQuery("SELECT * FROM kunde WHERE name LIKE '%"+s1+"%' AND vorname LIKE '%"+s2+"%';");
				
		        rs.last();
		        int rows = rs.getRow();
		        rs.beforeFirst();
		        kunde = new String[rows][11];
		        //System.out.println(rows);
		        while (rs.next()){
		          // Alle Kundenangaben laufen hier durch
		        	for(int i=0;i<11;i++)
		        	{
		        	kunde[index1][i] = rs.getString(i+1);
		        	System.out.println(kunde[index1][i]);
		        	}
		            index1++;		         
		        }
		        model.setDataVector(kunde, columnNames);
		        model.fireTableDataChanged();
			}
			
			catch(Exception exep)
			{
				Fehler.setText("Fehler beim Suchen: " + exep.toString());
			}
			
		 }


				
		}
}

Bitte hilft mir =D
 
Anonymous hat gesagt.:
..Und dann man die Spaltenbreite mit einem Doppelklick optimieren kann ?
Einen MouseListener an den Table Header hängen.
Bei mousePressed auf Doppelklick prüfen und dann prüfen welcher cursor angezeigt wird (default oder resize cursor).
Bei Cursor.E_RESIZE_CURSOR die Spalte bestimmen, dann die maximale Spaltenbreite ermitteln und die Breite im TableColumn setzen.
Code:
...
        final JTableHeader header = tablesuche.getTableHeader();
        header.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                if(e.getClickCount() == 2){
                    if(header.getCursor().getType() == Cursor.E_RESIZE_CURSOR){
                        int column = tablesuche.columnAtPoint(new Point(e.getX()-4, e.getY()));
                        int w = getMaxColumnWidth(tablesuche, column, true, 4);
                        TableColumn tCol = header.getColumnModel().getColumn(column);
                        tCol.setWidth(w);
                    }
                }
            }
        });
...
    /*
     * @param JTable aTable, the JTable to autoresize the columns on
     * @param int columnNo, the column number, starting at zero, to calculate the maximum width on
     * @param boolean includeColumnHeaderWidth, use the Column Header width as a minimum width
     * @param int columnPadding, how many extra pixels do you want on the end of each column
     * @returns The table width, just in case the caller wants it...
     *
     * @author  Owen (omcgovern)
     * [url]http://forum.java.sun.com/thread.jspa?forumID=54&messageID=2532529&threadID=527301[/url]
     */
    private static int getMaxColumnWidth( JTable aTable, int columnNo,
            boolean includeColumnHeaderWidth,
            int columnPadding ) {
        TableColumn column = aTable.getColumnModel().getColumn( columnNo );
        Component comp = null;
        int maxWidth = 0;
        
        if ( includeColumnHeaderWidth ) {
            TableCellRenderer headerRenderer = column.getHeaderRenderer();
            if ( headerRenderer != null ) {
                comp = headerRenderer.getTableCellRendererComponent( aTable, column.getHeaderValue(), false, false, 0, columnNo );
                
                if ( comp instanceof JTextComponent ) {
                    JTextComponent jtextComp = (JTextComponent)comp;
                    
                    String text = jtextComp.getText();
                    Font font = jtextComp.getFont();
                    FontMetrics fontMetrics = jtextComp.getFontMetrics( font );
                    
                    maxWidth = SwingUtilities.computeStringWidth( fontMetrics, text );
                } else {
                    maxWidth = comp.getPreferredSize().width;
                }
            } else {
                try {
                    String headerText = (String)column.getHeaderValue();
                    JLabel defaultLabel = new JLabel( headerText );
                    
                    Font font = defaultLabel.getFont();
                    FontMetrics fontMetrics = defaultLabel.getFontMetrics( font );
                    
                    maxWidth = SwingUtilities.computeStringWidth( fontMetrics, headerText );
                } catch ( ClassCastException ce ) {
                    // Can't work out the header column width..
                    maxWidth = 0;
                }
            }
        }
        
        TableCellRenderer tableCellRenderer;
        // Component comp;
        int cellWidth   = 0;
        
        for (int i = 0; i < aTable.getRowCount(); i++) {
            tableCellRenderer = aTable.getCellRenderer( i, columnNo );
            
            comp = tableCellRenderer.getTableCellRendererComponent( aTable, aTable.getValueAt( i, columnNo ), false, false, i, columnNo );
            
            if ( comp instanceof JTextComponent ) {
                JTextComponent jtextComp = (JTextComponent)comp;
                
                String text = jtextComp.getText();
                Font font = jtextComp.getFont();
                FontMetrics fontMetrics = jtextComp.getFontMetrics( font );
                
                int textWidth = SwingUtilities.computeStringWidth( fontMetrics, text );
                
                maxWidth = Math.max( maxWidth, textWidth );
            } else {
                cellWidth = comp.getPreferredSize().width;
                
                // maxWidth = Math.max ( headerWidth, cellWidth );
                maxWidth = Math.max( maxWidth, cellWidth );
            }
        }
        
        return ( maxWidth + columnPadding );
    }
...
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben