2016-08-05 29 views
0

Ich verwende ein Cardlayout, um eine Liste der Panels anzuzeigen. In einem der Panels habe ich eine JTable mit mehreren Spalten und Zeilen von Datensätzen. Nun möchte Ich mag die erste Spalte der JTable entfernen, je nachdem, welcher Benutzer sich anmeldet Below mein Code (im Login-JFrame.):So entfernen Sie eine jTable-Spalte aus einer anderen Klasse, in Java

//calling the jframe that holds the cardlayout 

Home home= new Home(); 

//calling the panel that holds the jtable 

viewRecords b =new viewRecords(); 

//when a user logs in 

//removing the 1st column of the jtable in panel viewRecords 

b.jTable1.removeColumn(b.jTable1.getColumnModel().getColumn(0)); 

//displaying jFrame Home 

Home.setVisible(true); 

Das Problem ist: Es funktioniert gut, wenn Verwenden Sie eine JFrame, um die Tabelle anzuzeigen, aber nicht funktioniert, während JPanel verwenden, um die gleiche Tabelle anzuzeigen. Irgendeine Idee, wie das funktioniert?

+0

Ist die 'JTable' auf dem' JPanel' nicht sichtbar? Bitte geben Sie weitere Details zu Ihrem Problem an. Vielleicht könnte dir das auch helfen [Wie man eine JTable in einem JPanel mit Java anzeigt?] (Http://stackoverflow.com/a/2623987/5702956) –

+0

Der Titel kombiniert mit den ersten Sätzen deiner Frage deutet darauf hin, dass die Code 'erweitert JPanel'. Ist diese Einschätzung richtig? Ich frage, weil Erweiterungspanel wirklich nur notwendig ist, wenn man die 'paintComponent (Graphics)' Methode überschreibt, und das scheint nicht so zu sein. Auch, dass das Modell (z. B. ein Tischmodell) zu sehr an die Ansicht (die Paneele) gebunden ist, wo dies ein schlechtes Design ist und zuerst fixiert werden sollte. –

Antwort

0

dieser Code verstecken fisrt Spalte in jtable

jTable1.getColumnModel().getColumn(0).setMinWidth(0); 
jTable1.getColumnModel().getColumn(0).setPreferredWidth(0); 
jTable1.getColumnModel().getColumn(0).setMaxWidth(0); 
+1

Spielen Sie nicht mit den Breiten der TableColumn. Die Spalte ist immer noch Teil der Ansicht. Wenn der Benutzer die Tab-Taste verwendet, um sich von Spalte zu Spalte zu bewegen, wird die "versteckte" Spalte immer noch den Fokus erhalten, was den Benutzer verwirren wird. – camickr

2

Sie die Spalte aus der Ansicht der Tabelle entfernen:

public void hideColumn(int modelColumn) 
{ 
    int viewColumn = table.convertColumnIndexToView(modelColumn); 

    if (viewColumn != -1) 
    { 
     TableColumnModel tcm = table.getColumnModel(); 
     TableColumn column = tcm.getColumn(viewColumn); 
     tcm.removeColumn(column); 
    } 
} 

Für eine Phantasie Implementierung dieser Logik Besuche die Table Column Manager die erlaubt dem Benutzer Spalten zu verstecken/anzeigen.

+0

das scheint auch nicht zu funktionieren .... die JTable ist auf einem Panel in Cardlayout – Kenn

+0

@Kenn, Dann machst du etwas falsch. Der Layout-Manager ist irrelevant. Es spielt keine Rolle, ob Sie die Tabelle direkt zum Rahmen oder zu einem Panel hinzufügen und dann das Panel zum Rahmen hinzufügen. Das Problem ist wahrscheinlich, dass "b.table1" nicht auf die Tabelle verweist, die auf dem Panel angezeigt wird. Sie müssen den Code neu strukturieren, damit Sie nicht auf Variablen wie diese zugreifen können. Ich denke, die einfachste Lösung besteht darin, eine "removeFirstColumn()" - Methode zu Ihrer Klasse hinzuzufügen, die die Tabelle enthält. Dann rufen Sie einfach die Methode auf. – camickr