Größe von JTextField mit Größe von JTable syncronisieren?

Geri_m1

Grünschnabel
Hallo!

Folgende Ausgangslage:
Ich habe ein Frame (GridBagLayout) welches 2 Panel (die wieder GridBagLayout sind) beinhaltet.

Das obere der beiden Frames definiert eine Suchmaske und beeinhaltet JTextFields und darüber als Beschriftung JLabels. Hier ist es möglich Suchkriterien für eine Ausgabe in einem Table einzugeben.

Das untere der beiden Frames zeigt einen JTabel wlecher sich in einer JScrollPane befindet. Hier werden dann aus einer Sammlung von Daten, die den Suchkriterien entsprechenden Daten, ausgegeben.
Über jeder Spalte des JTables soll das dazugehörige JTextField (zum suchen in der jeweiligen Spalte) platziert werden.

So jetzt mein Problem:
Ich hätte gerne dass die JTextFields (und die darüber befindlichen JLabels) genau über der jeweiligen Spalte der Tabelle ausgerichtet werden. Außerdem soll jedes JTextField natürlich die selbe Länge wie die dazugehörige Spalte haben.

Mein JTable hat bereits fix definierte Spalten Breiten
(wurde folgendermaßen definiert: columnWidths -> "WWWWWW";"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW";"WWWWWWWWWWWWWWWWWWWWWWW";"WWWWWWW";"WWWWWWWW";"WW";"WWWWWWWWWW";"WWWWWWWWWWWWWWWW")

Damit sich die JTextFields jedes mal beim erzeugen des Fensters positionieren und ihre Größe definieren habe ich folgende Methode geschrieben:
Code:
//--- set search fields' sizes according to corresponding table column sizes--- BEGIN ---
        java.awt.Component[] componentsRow1 = {null, cbProductRole, null, null, null, null, null, null};
        java.awt.Component[] componentsRow2 = {tfNumber, tfCustomer, tfName, cbStatus, tfCommunity, tfFederalState, tfCountry, cbTemplate};

        for (int i=0; i<productTable.getTableHeader().getColumnModel().getColumnCount(); i++) {
            int newWidth = productTable.getTableHeader().getColumnModel().getColumn(i).getPreferredWidth();
                if (componentsRow1[i] != null) 
                        {
                    componentsRow1[i].setPreferredSize(new java.awt.Dimension(newWidth, (int)componentsRow1[i].getPreferredSize().getHeight()));
                    componentsRow1[i].setMinimumSize(new java.awt.Dimension(newWidth, (int)componentsRow1[i].getPreferredSize().getHeight()));
                    componentsRow1[i].setMaximumSize(new java.awt.Dimension(32767, (int)componentsRow1[i].getPreferredSize().getHeight()));
                        }

                if (componentsRow2[i] != null) 
                    {
                    componentsRow2[i].setPreferredSize(new java.awt.Dimension(newWidth, (int)componentsRow2[i].getPreferredSize().getHeight()));
                    componentsRow2[i].setMinimumSize(new java.awt.Dimension(newWidth, (int)componentsRow2[i].getPreferredSize().getHeight()));
                    componentsRow2[i].setMaximumSize(new java.awt.Dimension(32767, (int)componentsRow2[i].getPreferredSize().getHeight()));
                    }
            }
        //--- set search fields' sizes according to corresponding table column sizes--- END ---
Die Methode geht in einer for Schleife alle Spalten durch und ließt pro Spalte die PreferredWidth aus. Danach wird im nächsten Schritt die PreferredSize des JTexField bzw. JLabel mit diesem Wert gesetzt.
Somit sollte eigentlich jedes TextField und das darüberliegende Label gleich groß wie seine zugehörige Spalte (die direkt darunter liegen sollte) sein. -> Ergebnis: ist aber nich so! Meine TextFields bekommen einfach irgendeine Größe.

Weitere Infos:
Die Maximum und minumum Size der TextFields habe ich bereits auf extrem hohen bzw. niedirgen Wert gesetzt.


Ich hoffe irgendjemand kann mir helfen denn ich bin schon ziemlich am Verzweifeln! Finde das Problem einfach nicht, eigentlich sollte die Methode in der ich die Preferred Size setzte ja auch die Arbeit wie gewünscht verrichten?!
 
Wenn du einen Layout-Manager verwendest, dann hast du nicht immer die Kontrolle über die Größe deiner Komponenten.
Sicher lösen könntest du dieses Problem, wenn du für den oberen Bereich ein Null-Layout verwendest (dann muss du dich um Position und Größe deiner Elemente selber kümmern - aber das scheint ja das zu sein, was du möchtest.

Alternativ würde ich vorschlagen, dass du als Suchfelder auch gleich eine Tabelle nimmst - eine Tabelle mit einer Zeile und den entsprechenden Überschriften.
Das dürfte optisch das sein, was du suchst und sogar noch besser aussehen.

Du kannst dann auch auf diese Tabellenzellen Listener ansetzen.
 
Hallo!

Danke für die Antwort auf meine Frage. Ich habe mittlerweile wie du es auch gesagt hast eine zweite Tabelle, mit Editierbaren Zellen um die Suchkriterien eingben zu können, anstatt den TextFeldern erstellt.

Danke nochmals!
 
Zurück