Tout d'abord, voyez ce conseil avisé de @AndrewThompson :
Il existe des rubriques utiles pour comprendre ce que cela signifie ici :
- Bordure et positionnement de fenêtre non redimensionnables
- Dois-je éviter l'utilisation des méthodes set(Preferred|Maximum|Minimum)Size dans Java Swing ?
- Exemple de mise en page imbriquée
- Fournir un espace blanc dans une interface graphique Swing
Vous verrez l'utilisation de méthodes comme setLocation()
, setBounds()
ou setSize()
est fortement déconseillé. Cependant, j'ai déjà vu cette approche appliquée pour permettre la personnalisation des formulaires. Mais au lieu de coordonnées spécifiques (x, y) et fixes (largeur, hauteur), vous pouvez stocker des contraintes pour GridBagLayout
. Supposons que vous ayez un tableau comme celui-ci :
Je commencerais d'abord avec une classe pour envelopper les données de la base de données :
public class Data {
private String componentType, text;
private int column, row, width, height, weightX, weightY;
public Data(String componentType, int column, int row, int width, int height
,int weightX, int weightY, String text) {
this.componentType = componentType;
this.column = column;
this.row = row;
this.width = width;
this.height = height;
this.weightX = weightX;
this.weightY = weightY;
this.text = text;
}
// getters and setters here
}
Comme les appels de base de données prennent du temps, vous devez envisager d'utiliser un SwingWorker pour faire l'appel de la base de données (tâche chronophage) dans un thread en arrière-plan et créer/mettre à jour votre interface graphique dans le Thread de répartition des événements .
Cela dit, vous pouvez avoir quelque chose comme ceci :
public class Demo {
private JPanel content;
private JFrame frame;
private void createAndShowGUI() {
content = new JPanel(new GridBagLayout());
SwingWorker<Void, Data> worker = new SwingWorker<Void, Data>() {
@Override
protected Void doInBackground() {
try{
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","password");
Statement stat = con.createStatement();
ResultSet rs = stat.executeQuery("select * from TableName");
while(rs.next()){
String componentType = rs.getString("component");
int column = rs.getInt("x");
int row = rs.getInt("y");
int width = rs.getInt("width");
int height = rs.getInt("height");
int weightx = rs.getInt("weightx");
int weighty = rs.getInt("weighty");
String text = rs.getString("text");
Data data = new Data(componentType, column, row, width, height
,weightx, weighty, text);
publish(data);
}
rs.close();
stat.close();
con.close();
} catch(Exception e) {
System.out.println(e);
}
return null;
}
@Override
protected void process(List<Data> chunks) {
for(Data data : chunks) {
JComponent component = null;
if(data.getComponentType().equalsIgnoreCase("JTextField")) {
component = new JTextField(data.getText());
}
if(data.getComponentType().equalsIgnoreCase("JComboBox")) {
component = new JComboBox();
}
if(data.getComponentType().equalsIgnoreCase("JLabel")) {
component = new JLabel(data.getText());
}
if(component != null) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = data.getColumn();
constraints.gridy = data.getRow();
constraints.gridwidth = data.getWidth();
constraints.gridheight = data.getHeight();
constraints.weightx = data.getWeightX();
constraints.weighty = data.getWeightY();
constraints.anchor = GridBagConstraints.WEST;
constraints.fill = GridBagConstraints.BOTH;
constraints.insets = new Insets(8,8,8,8);
content.add(component, constraints);
}
}
}
@Override
protected void done() {
frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(content);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
};
worker.execute();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
}
Et vous verrez quelque chose comme ceci :