ich habe das GridBagLayout in einer Klasse gelöst, welche Formatierungselemente variabel zur Laufzeit parst. Voraussetzung ist Java 1.4, weil ich auf regular expressions zugreife.
Internationalisiert wird auch, dass kann man natürlich weglassen.
Vielleicht hilft das ja noch jemandem. Viele Grüße
Kit
GridBagPane.java
Code:
import java.awt.*;
import javax.swing.*;
import java.util.ResourceBundle;
class GridBagPane extends JPanel {
GlobalProperties GP;
GridBagLayout gbl;
GridBagConstraints gbc;
static GridBagConstraints LabelConstraints=new GridBagConstraints(1,1,1,1,1d,1d,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(6,6,6,3),0,0);
static GridBagConstraints DefaultConstraints=new GridBagConstraints(0,0,1,1,1.0,1.0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(6,3,6,6), 0, 0);
static Dimension DefaultMinSize=new Dimension(96,18);
static Dimension DefaultPrefSize=new Dimension(120,24);
GridBagPane(GlobalProperties GP) {
this.GP=GP;
gbl=new GridBagLayout();
gbc=(GridBagConstraints) DefaultConstraints.clone();
setLayout(gbl);
}
public Component add(JComponent c, String l, int gridx, int gridy) {
add(new JLabel(l, SwingConstants.RIGHT), new GridBagConstraints(gridx-1,gridy,1,1,1d,1d,GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(6,6,6,3),0,0));
gbc.gridx=gridx;
gbc.gridy=gridy;
gbc.gridwidth=1;
gbc.gridheight=1;
c.setMinimumSize(DefaultMinSize);
c.setPreferredSize(DefaultPrefSize);
add(c, gbc);
return c;
}
public Component add(JComponent c, String f) {
String e[]=f.split("[,]+");
for (int i=0; i<e.length; i++) {
String s[]=e[i].split("[\\=]+");
if (s.length==1 ) {
parseFormatString(c, s[0].trim());
} else if (s.length==2 ) {
parseFormatString(c, s[0].trim(), s[1].trim());
}
}
c.setMinimumSize(DefaultMinSize);
c.setPreferredSize(DefaultPrefSize);
add(c, gbc);
gbc.gridx+=gbc.gridwidth+1;
return c;
}
public GridBagConstraints getConstraints() {
return gbc;
}
public void parseFormatString(JComponent c, String s, String a) {
if (s.equalsIgnoreCase("gridx")) {
gbc.gridx=Integer.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("gridy")) {
gbc.gridy=Integer.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("gridheight")) {
gbc.gridheight=Integer.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("gridwidth")) {
gbc.gridwidth=Integer.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("weightx")) {
gbc.weightx=Double.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("weighty")) {
gbc.weighty=Double.valueOf(a).intValue();
} else if (s.equalsIgnoreCase("anchor")) {
try {
gbc.anchor=gbc.getClass().getField(a).getInt(gbc);
} catch (Exception ex) {
}
}
else if (s.equalsIgnoreCase("fill")) {
try {
gbc.fill=gbc.getClass().getField(a).getInt(gbc);
} catch (Exception ex) {
}
}
else if (s.equalsIgnoreCase("ipdax")) {
gbc.ipadx=Integer.valueOf(a).intValue();
}
else if (s.equalsIgnoreCase("ipady")) {
gbc.ipady=Integer.valueOf(a).intValue();
}
else if (s.equalsIgnoreCase("insets")) {
String t[]=a.split("[\\s]+");
if (t.length==4) {
gbc.insets.left=Integer.valueOf(t[0]).intValue();
gbc.insets.top=Integer.valueOf(t[1]).intValue();
gbc.insets.right=Integer.valueOf(t[2]).intValue();
gbc.insets.bottom=Integer.valueOf(t[3]).intValue();
}
}
else if (s.equalsIgnoreCase("label")) {
LabelConstraints.gridx=gbc.gridx;
LabelConstraints.gridy=gbc.gridy;
add(new JLabel(GP.localizeStr(a), SwingConstants.RIGHT), LabelConstraints);
gbc.gridx++;
}
else if (s.equalsIgnoreCase("setToolTipText")) {
c.setToolTipText(GP.localizeStr(a));
}
}
public void parseFormatString(JComponent c, String s) {
if (s.equalsIgnoreCase("nl")) {
gbc.gridx=0;
gbc.gridy++;
} else if (s.equalsIgnoreCase("reset")) {
int gridx=gbc.gridx;
int gridy=gbc.gridy;
gbc=(GridBagConstraints) DefaultConstraints.clone();
gbc.gridx=gridx;
gbc.gridy=gridy;
}
}
}
wird dann genutzt mit
Code:
CapitalPane = new GridBagPane(GP);
CapitalPane.add(TF_Capital, "label=i18n_Amount");
CapitalPane.add(TF_Valuta, "label=i18n_Valuta");
CapitalPane.add(TF_Rate, "nl, reset, label=i18n_Rate");
CapitalPane.add(TF_RateFrom, "label=i18n_FirstOn");
CapitalPane.add(TF_RateTo,"label=i18n_LastOn");
CapitalPane.add(TF_InterestRate, "nl, label=i18n_InterestRate");
CapitalPane.add(TF_InterestCycle, "label=i18n_InterestCycle");
CapitalPane.add(TF_DayCountConvention, "label=i18n_DayCountConvention");
OKButton = new JButton(GP.localizeStr("i18n_Execute"));
CapitalPane.add(OKButton, "nl, gridx=7, fill=HORIZONTAL");
das Ergebnis des letzen Code-Schnippsels ist dann:
Lesezeichen