Hallo zusammen,
als Java-Neuling beschäftige ich mich gerade mit dem Aufbau einer GUI mit Swing. Viele Beiträge in diesem Forum haben mir in der letzten Zeit schon oft weitergeholfen, dafür vorab erst einmal: Vielen, vielen Dank :toll:
Nun zu meinem Problem/ Frage.
Ich bin dabei eine Oberfläche zu implementieren, die aus zwei JPanels besteht.
Im oberen befindet sich eine Tabelle. Jede Tabellenzeile repräsentiert einen Datensatz, im Beispiel eine Adresse. Die Tabelle zeigt nur charakteristische Merkmale des Datensatzes an (z. B. Name).
Im unteren befinden sich so viele Textfelder, die alle Informationen eines Datensatzes (Adresse) anzeigen. Sobald in der Tabelle eine Zelle ausgewählt wird, zeigen die Textfelder im unteren JPanel alle Informationen zum markierten Datensatz an.
Dies funktioniert auch einwandfrei, einzig die Geschwindigkeit stört mich. Ist der JFrame (der die beiden JPane enthält), nicht maximiert, so kann ich mit den Pfeiltasten reibungslos in allen Richtungen durch die Tabelle scrollen und jeder Datensatz wird sofort - ohne spürbare Verzögerung - im unteren JPanel angezeigt. Wenn ich den JFrame maximiere, ändert sich dieses Verhalten. Das Blättern/ Scrollen mit den Pfeiltasten klappt nicht mehr so flüssig und die Aktualisierung der Textfelder klappt auch nur verzögert. Woran kann das liegen? Was mache ich falsch?
Anbei mal mein abgespeckter Programmcode:
Ein Datensatz-Objekt
Controller
Der untere Panel ("DetailPanel")
Die View, also der JFrame, bestehend aus dem oberen JPanel mit Tabelle und dem unteren "DetailPanel"
Und das TableModel:
Anbei das ganze auch als ausführbare jar-Datei, damit ihr euch etwas darunter vorstellen könnt.
Mein System: Win 7 x64, Java 6.0.18
Würde mich über eure Hinweise und Anregungen freuen!
Michael
als Java-Neuling beschäftige ich mich gerade mit dem Aufbau einer GUI mit Swing. Viele Beiträge in diesem Forum haben mir in der letzten Zeit schon oft weitergeholfen, dafür vorab erst einmal: Vielen, vielen Dank :toll:
Nun zu meinem Problem/ Frage.
Ich bin dabei eine Oberfläche zu implementieren, die aus zwei JPanels besteht.
Im oberen befindet sich eine Tabelle. Jede Tabellenzeile repräsentiert einen Datensatz, im Beispiel eine Adresse. Die Tabelle zeigt nur charakteristische Merkmale des Datensatzes an (z. B. Name).
Im unteren befinden sich so viele Textfelder, die alle Informationen eines Datensatzes (Adresse) anzeigen. Sobald in der Tabelle eine Zelle ausgewählt wird, zeigen die Textfelder im unteren JPanel alle Informationen zum markierten Datensatz an.
Dies funktioniert auch einwandfrei, einzig die Geschwindigkeit stört mich. Ist der JFrame (der die beiden JPane enthält), nicht maximiert, so kann ich mit den Pfeiltasten reibungslos in allen Richtungen durch die Tabelle scrollen und jeder Datensatz wird sofort - ohne spürbare Verzögerung - im unteren JPanel angezeigt. Wenn ich den JFrame maximiere, ändert sich dieses Verhalten. Das Blättern/ Scrollen mit den Pfeiltasten klappt nicht mehr so flüssig und die Aktualisierung der Textfelder klappt auch nur verzögert. Woran kann das liegen? Was mache ich falsch?
Anbei mal mein abgespeckter Programmcode:
Ein Datensatz-Objekt
Java:
public class Datensatz {
Object[] data;
public Datensatz( int val1, String val2, String val3, String val4, String val5 ) {
data = new Object[8];
data[ 0 ] = val1;
data[ 1 ] = val2;
data[ 2 ] = val3;
data[ 3 ] = val4;
data[ 4 ] = val5;
data[ 5 ] = "Nummer";
data[ 6 ] = "E-Mail";
data[ 7 ] = "Website";
}
public Object get( int i ) {
return data[ i ];
}
}
Controller
Java:
public class Controller {
private static Controller instance = null;
public static void main( String[] args ) {
Controller.getInstance();
}
public static Controller getInstance() {
if( instance == null ) {
instance = new Controller();
}
return instance;
}
View view;
public Controller() {
view = new View();
view.setVisible( true );
}
}
Der untere Panel ("DetailPanel")
Java:
import java.awt.FlowLayout;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class DetailPanel extends JPanel {
private static final long serialVersionUID = 1L;
private JTextField[] fields = new JTextField[8];
public DetailPanel() {
super( new FlowLayout() );
for( int i = 0; i < fields.length; i++ ) {
fields[ i ] = new JTextField( 30 );
add( fields[ i ] );
}
}
public void setDatensatz( Datensatz d ) {
for( int i = 0; i < fields.length; i++ ) {
fields[ i ].setText( String.valueOf( d.get( i ) ) );
}
}
}
Die View, also der JFrame, bestehend aus dem oberen JPanel mit Tabelle und dem unteren "DetailPanel"
Java:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class View extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel panel;
private JPanel panelNorth;
private JTable table;
private MyTableModel tablemodel;
private DetailPanel panelCenter;
public View() {
super( "Slow Table Example" );
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
panel = new JPanel( new BorderLayout() );
panelNorth = new JPanel();
panelCenter = new DetailPanel();
tablemodel = new MyTableModel();
table = new JTable( tablemodel );
table.getSelectionModel().addListSelectionListener( new ListSelectionListener() {
@Override
public void valueChanged( ListSelectionEvent e ) {
int selRow = table.getSelectedRow();
if( selRow < 0 )
return;
Datensatz d = tablemodel.data.get( table.convertRowIndexToModel( selRow ) );
panelCenter.setDatensatz( d );
}
} );
panelNorth.add( new JScrollPane( table ) );
panel.add( panelNorth, BorderLayout.NORTH );
panel.add( panelCenter, BorderLayout.CENTER );
add( panel );
setSize( 800, 600 );
}
}
Und das TableModel:
Java:
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
public class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
public ArrayList<Datensatz> data;
public MyTableModel() {
data = new ArrayList<Datensatz>();
data.add( new Datensatz( 1, "Name 1", "Peschelstrasse 27", "1139", "Dresden" ) );
data.add( new Datensatz( 2, "Name 2", "Merianplatz 3", "1169", "Dresden" ) );
data.add( new Datensatz( 3, "Name 3", "Hofmühlenstr. 29", "1187", "Dresden" ) );
[...]
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public Object getValueAt( int rowIndex, int columnIndex ) {
return data.get( rowIndex ).get( columnIndex );
}
}
Anbei das ganze auch als ausführbare jar-Datei, damit ihr euch etwas darunter vorstellen könnt.
Mein System: Win 7 x64, Java 6.0.18
Würde mich über eure Hinweise und Anregungen freuen!
Michael