Moin Community,
ich habe folgendes Problem. Wenn ich zum ersten Mal nach dem Programmstart Daten in meine JTables lade (sei es auch nur eine Zeile) oder z.B. zum ersten Mal meine aboutBox aufrufe, bekomme ich ein Delay von ein paar Sekunden bevor das Gewollte auch passiert. Das komische ist, wenn ich z.B. eine Zeile in meine JTable lade und dann die aboutBox aufrufe ist diese sofort da und andersherum, wenn ich erst die aboutBox nach Programmstart aufrufe kann ich die JTables ohne Delay mit Daten befüllen. Der Delay tritt wohlgemerkt nur einmal nach dem Programmstart auf. Danach funktioniert alles wunderbar und schnell. Ich arbeite mit dem Swing Application Framework.
Vielleicht kann mir jemand einen Tipp geben...verzweifele langsam an dem Problem.
Simon
ich habe folgendes Problem. Wenn ich zum ersten Mal nach dem Programmstart Daten in meine JTables lade (sei es auch nur eine Zeile) oder z.B. zum ersten Mal meine aboutBox aufrufe, bekomme ich ein Delay von ein paar Sekunden bevor das Gewollte auch passiert. Das komische ist, wenn ich z.B. eine Zeile in meine JTable lade und dann die aboutBox aufrufe ist diese sofort da und andersherum, wenn ich erst die aboutBox nach Programmstart aufrufe kann ich die JTables ohne Delay mit Daten befüllen. Der Delay tritt wohlgemerkt nur einmal nach dem Programmstart auf. Danach funktioniert alles wunderbar und schnell. Ich arbeite mit dem Swing Application Framework.
Java:
package org.rdo.gui;
import net.java.balloontip.BalloonTip;
import net.java.balloontip.styles.BalloonTipStyle;
import net.java.balloontip.styles.MinimalBalloonStyle;
import net.java.balloontip.utils.TimingUtils;
import org.jdesktop.application.Action;
import org.jdesktop.application.Application;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.Task;
import org.jdesktop.application.View;
import org.rdo.calc.CalcBeanspruchungen;
import org.rdo.calc.Einheiten;
import org.rdo.daten.Punkt;
import org.rdo.daten.Schicht;
import org.rdo.daten.SchichtenTypen;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.EventObject;
import java.util.Vector;
import java.util.logging.Logger;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JToolBar;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
/**
* MainGui
* @author Simon 2010
*
* TODO adden von patterns...
* ******************************************************************
* TODO ca. 2-5 Sek. delay beim ersten Füllen des JTables mit Daten...WTF??
* TODO "kein" Schichtenverbund implementieren
* TODO Unendliche Besselnullstellen
* TODO Konstanden für jeden Parameter m zwischenspeichern
* TODO Matrizen per Hand ausmultiplizieren (Beschleunigung der Rechenläufe)
* TODO Parralelisierung, momentan wird nur ein Rechenkern genutzt (Beschleunigung der Rechenläufe)
* TODO Zeichnen von Auswertungsdiagrammen (nötig??)
* TODO komplette RDO implementieren
*/
public class MainGui extends SingleFrameApplication {
private static final Logger logger = Logger.getLogger(MainGui.class.getName());
private static final Insets zeroInsets = new Insets(0,0,0,0);
private ResourceMap appResourceMap;
private JTabbedPane tabbedPane;
private JSplitPane splitPane;
private ModellPanel grafik;
private SchichtenTabelle tableSchichten;
private PunkteTabelle tablePunkte;
private JToolBar toolbar1;
private JDialog aboutBox = null;
private double radius = 15.0D;
private double last = 5.0D; // Last in Tonnen
private double druck = Einheiten.erzeugeDruck(Einheiten.megaToKilo(last), radius);
private Vector<Schicht> schichten = new Vector<Schicht>();
private Vector<Punkt> pkt = new Vector<Punkt>();
private ArrayList<DecimalField> dfs = new ArrayList<DecimalField>();
private SchichtenTypen typen;
private BalloonTip errBalloon = null;
/**
*
* @return Rechentask der im Hintergrundthread ausgeführt wird
*/
@SuppressWarnings("rawtypes")
@Action
(block = Task.BlockingScope.WINDOW)
public Task calc() {
JButton button = (JButton)toolbar1.getComponentAtIndex(toolbar1.getComponentCount()-1);
// long a = System.currentTimeMillis();
// long c = System.currentTimeMillis();
// System.out.println(" TIME[s]: "+(double)(c-a)/1000);
if(!this.tableSchichten.noErrors(button)) return null;
if(!this.tablePunkte.noErrors(button)) return null;
if(!noErrors()) return null;
return new Rechne();
}
/**
* TestCase laden, also Schichten und Prüfstellen
*/
@Action
public void tc() {
schichten.add(new Schicht(12, 20000, 0.5));
schichten.add(new Schicht(20, 10000, 0.5));
schichten.add(new Schicht(52, 2000, 0.5));
schichten.add(new Schicht(0, 400, 0.5));
this.tableSchichten.model.load();
pkt.add(new Punkt(0.0D, 0.0D));
pkt.add(new Punkt(6.0D, 0.0D));
pkt.add(new Punkt(12.0D, 0.0D));
pkt.add(new Punkt(12.00000001D, 0.0D));
pkt.add(new Punkt(22.0D, 0.0D));
pkt.add(new Punkt(32.0D, 0.0D));
pkt.add(new Punkt(32.00000001D, 0.0D));
pkt.add(new Punkt(58.0D, 0.0D));
pkt.add(new Punkt(84.0D, 0.0D));
pkt.add(new Punkt(84.00000001D, 0.0D));
this.tablePunkte.model.load();
}
/**
* Programminfos zeigen
*/
@Action
public void showAboutBox() {
if (aboutBox == null) {
aboutBox = createAboutBox();
}
show(aboutBox);
}
/**
* Programminfos schließen
*/
@Action
public void closeAboutBox() {
if (aboutBox != null) {
aboutBox.setVisible(false);
aboutBox = null;
}
}
/**
* Entfernt Schicht in Schichtentabelle
*/
@Action
public void delSchicht() {
tableSchichten.delSchicht();
}
/**
* Fügt Schicht in Schichtentabelle hinzu
*/
@Action
public void addSchicht() {
tableSchichten.addSchicht();
}
/**
* Entfernt Punkt in Punktetabelle
*/
@Action
public void delPunkt() {
tablePunkte.delPunkt();
}
/**
* Fügt Punkt in Punktetabelle hinzu
*/
@Action
public void addPunkt() {
tablePunkte.addPunkt();
}
/**
* @param e
*/
@Action
public void last(ActionEvent e) {
if(((DecimalField)e.getSource()).getText().toCharArray().length != 0) {
last = ((DecimalField)e.getSource()).getValue();
druck = Einheiten.erzeugeDruck(Einheiten.megaToKilo(last), radius);
if(dfs.size() > 0){
dfs.get(1).setValue(druck);
mussNeu();
}
}
}
/**
* @param e
*/
@Action
public void druck(ActionEvent e) {
if(((DecimalField)e.getSource()).getText().toCharArray().length != 0) {
druck = ((DecimalField)e.getSource()).getValue();
last = Einheiten.druckZuTonnen(druck, radius);
if(dfs.size() > 0) {
dfs.get(0).setValue(last);
mussNeu();
}
}
}
/**
* @param e
*/
@Action
public void radius(ActionEvent e) {
if(((DecimalField)e.getSource()).getText().toCharArray().length != 0) {
radius = ((DecimalField)e.getSource()).getValue();
druck = Einheiten.erzeugeDruck(Einheiten.megaToKilo(last), radius);
if(dfs.size() > 0) {
dfs.get(1).setValue(druck);
mussNeu();
}
}
}
private boolean noErrors(){
for(DecimalField df : dfs) {
if(df.getText().toCharArray().length == 0) {
showErrorMessage(df, this.appResourceMap.getString("error.leer"));
} else {
if(df.getValue() == 0) {
showErrorMessage(df, this.appResourceMap.getString("error.leer"));
}
}
}
return true;
}
private void showErrorMessage(JComponent comp, String text) {
showMessage(comp, text, new Color(255, 255, 10, 220));
}
private void showMessage(JComponent comp, String text, Color color) {
if (errBalloon!=null) {
errBalloon.closeBalloon();
}
BalloonTipStyle style = new MinimalBalloonStyle(color, 5);
errBalloon = new BalloonTip(comp, new JLabel("<html><font color=\"#333333\">" + text + "</font></html>"),
style, BalloonTip.Orientation.LEFT_BELOW, BalloonTip.AttachLocation.ALIGNED, 30, 10, false);
errBalloon.addDefaultMouseListener(false);
TimingUtils.showTimedBalloon(errBalloon, 2000);
}
/**
* Setzt alle vorher berechneten Werte auf false und updated PunkteTabelle, da sich
* Werte oder Einträge in der SchichtenTabelle geändert haben.
*/
public void mussNeu(){
if(pkt.size() == 0) return;
else {
if(pkt.get(0).getBerechnet() == false) return;
for(Punkt p: pkt) {
p.setBerechnet(false);
this.tablePunkte.model.fireTableDataChanged();
}
}
}
/**
* Task für das Berechnen von Beanspruchungen aus einem Prüfstellen-Vector
* @author Simon Macura
*
*/
private class Rechne extends Task<Void, Void> {
Rechne(){
super(MainGui.this);
setUserCanCancel(true);
}
// berechne Beanspruchgen und speichere diese in dem globalem Punkte-Vector
@Override
protected Void doInBackground() {
CalcBeanspruchungen x;
int i = 0;
for(Punkt p : pkt){
if(this.isCancelled())
break;
if(!p.getBerechnet()){
x = new CalcBeanspruchungen(p.getKoordinateR(),
p.getKoordinateZ(), radius, druck, schichten);
p.setSigmaZ(x.spannung_Z);
p.setSigmaR(x.spannung_R);
p.setSigmaT(x.spannung_T);
p.setSchubRZ(x.schub_RZ);
p.setVerschiebungW(x.verschiebung_W);
p.setVerschiebungU(x.verschiebung_R);
p.setDehnungZ(x.dehnung_Z);
p.setDehnungR(x.dehnung_R);
p.setDehnungT(x.dehnung_T);
p.setBerechnet(true);
}
setProgress(++i,0,pkt.size());
}
return null;
}
@Override
protected void succeeded(Void success) {
tablePunkte.model.load();
}
@Override
protected void cancelled() {
this.cancel(true);
tablePunkte.model.load();
}
}
private javax.swing.Action getAction(String actionName) {
return getContext().getActionMap().get(actionName);
}
private void initGridBagConstraints(GridBagConstraints c) {
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.NONE;
c.gridwidth = 1;
c.gridheight = 1;
c.gridx = GridBagConstraints.RELATIVE;
c.gridy = GridBagConstraints.RELATIVE;
c.insets = zeroInsets;
c.ipadx = 4;
c.ipady = 4;
c.weightx = 0.0;
c.weighty = 0.0;
}
/**
* Programminfobox
* @return
*/
private JDialog createAboutBox() {
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(new EmptyBorder(0, 28, 16, 28)); // top, left, bottom, right
JLabel titleLabel = new JLabel();
titleLabel.setName("aboutTitleLabel");
GridBagConstraints c = new GridBagConstraints();
initGridBagConstraints(c);
c.anchor = GridBagConstraints.WEST;
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
c.ipady = 32;
c.weightx = 1.0;
panel.add(titleLabel, c);
String[] fields = {"description", "version", "vendor", "home"};
for(String field : fields) {
JLabel label = new JLabel();
label.setName(field + "Label");
JTextField textField = new JTextField();
textField.setName(field + "TextField");
textField.setEditable(false);
textField.setBorder(null);
initGridBagConstraints(c);
// c.anchor = GridBagConstraints.BASELINE_TRAILING; 1.6 ONLY
c.anchor = GridBagConstraints.EAST;
panel.add(label, c);
initGridBagConstraints(c);
c.weightx = 1.0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
panel.add(textField, c);
}
JButton closeAboutButton = new JButton();
closeAboutButton.setAction(getAction("closeAboutBox"));
initGridBagConstraints(c);
c.anchor = GridBagConstraints.EAST;
c.gridx = 1;
panel.add(closeAboutButton, c);
JDialog dialog = new JDialog();
dialog.setName("aboutDialog");
dialog.add(panel, BorderLayout.CENTER);
return dialog;
}
/**
* Erzeuge Menüs
* @param menuName
* @param actionNames
* @return
*/
private JMenu createMenu(String menuName, String[] actionNames) {
JMenu menu = new JMenu();
menu.setName(menuName);
for (String actionName : actionNames) {
if (actionName.equals("---")) {
menu.add(new JSeparator());
} else {
JMenuItem menuItem = new JMenuItem();
menuItem.setName(actionName + "MenuItem");
menuItem.setAction(getAction(actionName));
menuItem.setIcon(null);
menu.add(menuItem);
}
}
return menu;
}
/**
* Erzeuge Menps mit reinträgen
* @return
*/
private JMenuBar createMenuBar() {
JMenuBar menuBar = new JMenuBar();
String[] fileMenuActionNames = {
"tc",
"---",
"quit"
};
String[] helpMenuActionNames = {
"showAboutBox"
};
menuBar.add(createMenu("fileMenu", fileMenuActionNames));
menuBar.add(createMenu("helpMenu", helpMenuActionNames));
return menuBar;
}
/**
* Erzeuge JToolBar1
* @return
*/
private JToolBar createToolBar1() {
String[] toolbarActionNames = {
"tc",
"calc"
};
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
Border border = new EmptyBorder(2, 9, 2, 9); // top, left, bottom, right
for (String actionName : toolbarActionNames) {
JButton button = new JButton();
button.setName(actionName + "ToolBarButton");
button.setBorder(border);
button.setVerticalTextPosition(JButton.BOTTOM);
button.setHorizontalTextPosition(JButton.CENTER);
button.setAction(getAction(actionName));
button.setFocusable(false);
toolBar.add(button);
}
return toolBar;
}
/**
* Erzeuge JToolBar2
* @return
*/
private JToolBar createToolBar2() {
JToolBar toolBar = new JToolBar();
toolBar.setFloatable(false);
Border border = new EmptyBorder(2, 9, 2, 9); // top, left, bottom, right
String[] actionNames = {"last", "druck", "radius"};
Double[] values = {last , druck, radius};
for (int i=0; i < actionNames.length; i++) {
JLabel label = new JLabel(this.appResourceMap.getString(actionNames[i]+".text"));
label.setBorder(border);
toolBar.add(label);
DecimalField df = new DecimalField(3, getAction(actionNames[i]));
df.setColumns(7);
dfs.add(df);
df.setAction(getAction(actionNames[i]));
df.setValue(values[i]);
toolBar.add(df);
}
toolBar.setMaximumSize(new Dimension(420,26));
return toolBar;
}
/**
* Erzeuge JTabbedPane
* @return
*/
private JComponent createMainPanel() {
tabbedPane = new JTabbedPane(JTabbedPane.TOP);
typen = new SchichtenTypen(appResourceMap);
grafik = new ModellPanel(schichten, typen, 80);
tableSchichten = new SchichtenTabelle(this, schichten, typen, grafik);
String textSchichten = appResourceMap.getString("tableSchichten.text");
String tooltipSchichten = appResourceMap.getString("tableSchichten.tooltip");
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
tableSchichten.getScrollPane(), grafik.getScrollPane());
splitPane.setOneTouchExpandable(true);
splitPane.setResizeWeight(1.0); // Divider nach rechts...
splitPane.getLeftComponent().setMinimumSize(tableSchichten.getPreferredScrollableViewportSize());
splitPane.getRightComponent().setMinimumSize(grafik.getPreferredSize());
tabbedPane.addTab(textSchichten, null, splitPane, tooltipSchichten);
tablePunkte = new PunkteTabelle(this, pkt);
String textPunkte = appResourceMap.getString("tablePunkte.text");
String tooltipPunkte = appResourceMap.getString("tablePunkte.tooltip");
tabbedPane.addTab(textPunkte, null, tablePunkte.getScrollPane(), tooltipPunkte);
return tabbedPane;
}
/**
* Initialisierungen etc. die gemacht werden müssen bevor die GUI konstruiert wird
*/
@Override
protected void initialize(String[] args) {
appResourceMap = getContext().getResourceMap();
String textFiles = appResourceMap.getString("txtFileExtensionDescription");
}
/**
* Konstruiere GUI
*/
@Override
protected void startup() {
StatusBar statusBar = new StatusBar(this, getContext().getTaskMonitor());
addExitListener(new ConfirmExit());
View view = getMainView();
view.setComponent(createMainPanel());
// Toolbars werden so nicht da angezeigt wo ich se gern hätte
//List<JToolBar> toolbars = new ArrayList<JToolBar>();
//toolbars.add(toolbar1);
////toolbars.add(createToolBar2());
//view.setToolBars(toolbars);
JPanel toolbar = new JPanel();
toolbar.setLayout(new BoxLayout(toolbar, BoxLayout.X_AXIS));
toolbar1 = createToolBar1();
toolbar.add(createToolBar2());
toolbar.add(toolbar1);
view.getRootPane().getContentPane().add(toolbar, BorderLayout.NORTH);
view.setMenuBar(createMenuBar());
view.setStatusBar(statusBar);
getMainFrame().setIconImage(appResourceMap.getImageIcon(KEY_APPLICATION_ICON).getImage());
show(view);
}
/**
* Tasks die nach Initialisierung der GUI gemacht werden sollen
*/
@Override
protected void ready() {
}
/**
* GUI auf EDT starten.
* @param args
* @see Application#launch
*/
public static void main(String[] args) {
launch(MainGui.class, args);
}
private class ConfirmExit implements Application.ExitListener {
public boolean canExit(EventObject e) {
return true;
}
public void willExit(EventObject e) {
}
}
}
Vielleicht kann mir jemand einen Tipp geben...verzweifele langsam an dem Problem.
Simon
Zuletzt bearbeitet: