Hallo liebes Forum,
ich habe ein Multithread-Programm geschrieben, welches Datensätze (zeilenweise) in eine Tabelle füllt.
Leider wird nach der Befüllung, die Darstellung in meinem Fenster verschoben (s. 2. Bild, unten) Ich habe leider gerade kein Plan wieso das geschied.
Ich denke mir das es entweder am GridBagLayout oder an der JScrollPane liegen müsste. Wäre schön wenn mir dazu jemand einen Rat beisteuern könnte, da ich im Internet nicht ganz fündig geworden bin.
Sehr vielen Dank im Voraus!
Ich habe folgene Programmansicht:
![Unbenannt.jpg Unbenannt.jpg](https://www.tutorials.de/data/attachments/50/50526-bf147767dba1bab114bcfc21ff78c87e.jpg?hash=vxR3Z9uhur)
Das Problem was ich habe ist, wenn die Tabelle befüllt wird (zeilenweise aus der Model) und länger wird als die Ansicht hergibt, wird zunächst von der JScrollPane der Scrollbalken eingebländet und wenn die Befüllung abgeschlossen ist, kommt es zu einem Clipping-Effekt, wie unten im Bild dargestellt ist.
![Unbenannt2.jpg Unbenannt2.jpg](https://www.tutorials.de/data/attachments/50/50527-bd24e92cf1d9ee37853fbe72b6ff7a5d.jpg?hash=vSTpLPHZ7j)
Vielleicht ist noch hilfreich zu wissen, von wo aus ich meine Table (MyTableModel) aktualisiere (s. nachfolgenden Code: Zeilen 40, 41)
AktualisierungsThread aus meiner Controller-Klasse
ich habe ein Multithread-Programm geschrieben, welches Datensätze (zeilenweise) in eine Tabelle füllt.
Leider wird nach der Befüllung, die Darstellung in meinem Fenster verschoben (s. 2. Bild, unten) Ich habe leider gerade kein Plan wieso das geschied.
Ich denke mir das es entweder am GridBagLayout oder an der JScrollPane liegen müsste. Wäre schön wenn mir dazu jemand einen Rat beisteuern könnte, da ich im Internet nicht ganz fündig geworden bin.
Sehr vielen Dank im Voraus!
Ich habe folgene Programmansicht:
![Unbenannt.jpg Unbenannt.jpg](https://www.tutorials.de/data/attachments/50/50526-bf147767dba1bab114bcfc21ff78c87e.jpg?hash=vxR3Z9uhur)
Java:
...
private int frameSizeX;
private int frameSizeY;
JFrame mainF;
Container frameC;
GridBagLayout gbl;
private JTable tableT;
// Konstruktor
public View(){
//Window (Frame) size
frameSizeX = 1100;
frameSizeY = 500;
mainF = new JFrame();
frameC = new Container();
gbl = new GridBagLayout();
myTableModel = new MyTableModel();
tableT = new JTable(myTableModel){
tableT.getModel();
tableT.setFont(new Font("Arial", Font.PLAIN, 13));
// Colum sizing
TableColumn column = null;
for (int i = 0; i < tableT.getColumnCount(); i++) {
column = tableT.getColumnModel().getColumn(i);
switch(i){
case 0: column.setPreferredWidth(30); break;
case 1: column.setPreferredWidth(45); break;
case 4: column.setPreferredWidth(70); break;
case 6: column.setPreferredWidth(45); break;
default: column.setPreferredWidth(120); break;
}
}
tableT.setPreferredScrollableViewportSize(new Dimension(frameSizeX,450));
tableT.setFillsViewportHeight(true);
scrollP = new JScrollPane(tableT);
}
public void frame(){
mainF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainF.setSize(frameSizeX, frameSizeY); // Fenstergröße
mainF.setLocationRelativeTo(null); // Bildschirmmitte
frameC = mainF.getContentPane();
frameC.setLayout(gbl); // füge dem Container das GridBagLayout hinzu
// Die Mathode setFrameElements setzt nach dem GridBagLayout alle Buttons- und JLabel-Elemente
// sowie das JScrollPane-Element in das JFrame
setFrameElements(sourceL, 0, 0, 1, 1, 0.0, 0.0 );
setFrameElements(filePathTF, 0, 1, 2, 1, 0.6, 0.0 );
setFrameElements(statusLable, 0, 2, 1, 1, 0.001, 0.0 );
setFrameElements(status, 1, 2, 1, 1, 0.8, 0.0 );
setFrameElements(openB, 2, 1, 1, 1, 0.4, 0.0 );
setFrameElements(scanB, 2, 2, 1, 1, 0.001, 0.0 );
setFrameElements(exportB, 2, 3, 1, 1, 0.0, 0.0 );
setFrameElements(scrollP, 0, 4, 0, 1, 0.0, 0.0 );
// Fenster wird gezeichnet/aufgerufen
mainF.setResizable(true);
mainF.pack();
mainF.setVisible(true);
}
private void setFrameElements( Component c, int x, int y, int width, int height,
double weightx, double weighty)
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.LAST_LINE_START;
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbc.insets.set(3, 6, 3, 6);
gbl.setConstraints(c, gbc);
frameC.add(c);
}
Das Problem was ich habe ist, wenn die Tabelle befüllt wird (zeilenweise aus der Model) und länger wird als die Ansicht hergibt, wird zunächst von der JScrollPane der Scrollbalken eingebländet und wenn die Befüllung abgeschlossen ist, kommt es zu einem Clipping-Effekt, wie unten im Bild dargestellt ist.
![Unbenannt2.jpg Unbenannt2.jpg](https://www.tutorials.de/data/attachments/50/50527-bd24e92cf1d9ee37853fbe72b6ff7a5d.jpg?hash=vSTpLPHZ7j)
Vielleicht ist noch hilfreich zu wissen, von wo aus ich meine Table (MyTableModel) aktualisiere (s. nachfolgenden Code: Zeilen 40, 41)
AktualisierungsThread aus meiner Controller-Klasse
Java:
...
public class Controler implements ActionListener{
private Model m = null;
private View v = null;
public Controler(View v, Model m){
this.m = m;
this.v = v;
//Objekte zum Dateien auswählen
this.fileOpen = new JFileChooser();
this.fileExport = new JFileChooser();
//Schalte das Auswählen mehrere Dateien ein.
this.fileOpen.setMultiSelectionEnabled(true);
...
}
@Override
public void actionPerformed(ActionEvent ae){
if(ae.getSource() == v.getOpenB()){
...
}
else if(ae.getSource() == v.getScanB()){
// File-Übergabe an die Model
m.setFiles(fileOpen.getSelectedFiles()); // ermöglicht Multithead-Abarbeitung
// Die Model überprüft die Dateien nach personenbezogene Daten
m.readDatasets();
// Thread zur
Thread t = new Thread(new Runnable() {
@Override
public void run() {
v.setStatus("");
v.setStatus("Datenscan");
while(m.getThreadStatus() != Thread.State.TERMINATED){
// Aktualisiere die Tabelle (Tablemodel)
v.getMyTableModel().setTableContent(m.getReadBuffer());
v.getMyTableModel().update(); //Tabelle wird in der GUI aktualisiert
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Controler.class.getName()).log(Level.SEVERE, null, ex);
}
}
//Wenn alle Threads in der Filethread-Klasse beendet sind, soll der Benutzer über den Scannvorgang
//informiert werden und der Button für den Export als CSV-Datei aktiviert werden.
if(m.getThreadStatus() == Thread.State.TERMINATED){
v.setStatus("");
v.setStatus("Scan beendet");
v.getExportB().setEnabled(true);
}
}
});
t.start();
}
else if(ae.getSource() == v.getExportB()){
fileExport.setDialogType(JFileChooser.SAVE_DIALOG);
int request = fileExport.showSaveDialog(null);
...
v.setStatus("");
v.setStatus("Export durchgeführt");
}
else System.out.println("Es wurde kein CSV-Datei mit Inhalt generiert!");
}// Ende der Methode actionPerformed()
}// Klassenende
Zuletzt bearbeitet: