mboost-dp1

Java - holde styr på et dynamisk antal JTextFields


Gå til bund
Gravatar #1 - Vandmand
8. sep. 2013 11:53
Jeg er ved at skrive et lille Java program der bla. skal kunne hente et dynamisk antal raekker fra en MySQL database, herefter skal brugeren kunne redigere i et eller to af felterne, og 'gemme' dataen igen.

Jeg vil gerne 'vise' indholdet med en JLabel og et JTextField per felt der skal redigeres, men hvordan holder jeg styr på tekstfelterne, når jeg ikke ved hvor mange rækker der er? Jeg har set flere foreslå at man bruger getComponents på mit JPanel, men så skal jeg soretere labels fra, og hvordan sikrer jeg mig at det er den rigtige rækkefølge? Kan jeg på en måde tilknytte et id til tekstfeltet (der er et id per række)?
Gravatar #2 - markjensen
8. sep. 2013 11:58
Kan du ikke lave en ny klasse der nedarver fra JTextField som så har et ID der svarer til det ID du har i databasen?
Gravatar #3 - Vandmand
8. sep. 2013 12:01
markjensen (2) skrev:
Kan du ikke lave en ny klasse der nedarver fra JTextField som så har et ID der svarer til det ID du har i databasen?


Det kunne jeg vel egentlig godt (havde jeg faktisks let ikke tænkt på), men er der ikke en smartere måde, eller en anden klasse der passer bedre til formålet?
Gravatar #4 - arne_v
8. sep. 2013 16:21
#1

Mit forslag vil være at du udvider din objekt model til at have både et rent data objekt og et objekt med label, text field og data.

Eksempel:


import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class DynList extends JFrame {
private static final long serialVersionUID = 1L;
private List<DataItem> itemlist;
private List<DataItem> config(List<Data> datalist) {
List<DataItem> itemlist = new ArrayList<DataItem>();
for(Data data : datalist) {
itemlist.add(new DataItem(data));
}
return itemlist;
}
public DynList(List<Data> datalist) {
itemlist = config(datalist);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setTitle("Dynamic list");
JPanel labels = new JPanel();
labels.setLayout(new GridLayout(itemlist.size(), 1));
JPanel fields = new JPanel();
fields.setLayout(new GridLayout(itemlist.size(), 1));
for(DataItem item : itemlist) {
labels.add(item.getLabel());
fields.add(item.getTextField());
}
getContentPane().setLayout(new BorderLayout());
getContentPane().add(labels, BorderLayout.WEST);
getContentPane().add(fields, BorderLayout.CENTER);
JButton save = new JButton("Save");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
StringBuilder sb = new StringBuilder();
for(DataItem item : itemlist) {
if(item.isDirty()) {
sb.append("id ");
sb.append(item.getData().getId());
sb.append(" changed from ");
sb.append(item.getData().getValue());
sb.append(" to ");
sb.append(item.getTextField().getText());
sb.append("\r\n");
}
}
JOptionPane.showMessageDialog(DynList.this, sb.toString());
}
});
getContentPane().add(save, BorderLayout.SOUTH);
pack();

}
public static void main(String[] args) {
final List<Data> datalist = new ArrayList<Data>();
datalist.add(new Data(1, "A"));
datalist.add(new Data(2, "BB"));
datalist.add(new Data(3, "CCC"));
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame f = new DynList(datalist);
f.setVisible(true);
}
});
}
}

class Data {
private int id;
private String value;
public Data(int id, String value) {
this.id = id;
this.value = value;
}
public int getId() {
return id;
}
public String getValue() {
return value;
}
}

class DataItem {
private Data data;
private JLabel label;
private JTextField textField;
private boolean dirty;
public DataItem(Data data) {
this.data = data;
label = new JLabel(data.getId() + ": ");
textField = new JTextField(50);
textField.setText(data.getValue());
textField.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
dirty = true;
}
public void removeUpdate(DocumentEvent e) {
dirty = true;
}
public void changedUpdate(DocumentEvent e) {
dirty = true;
}
});
}
public Data getData() {
return data;
}
public JLabel getLabel() {
return label;
}
public JTextField getTextField() {
return textField;
}
public boolean isDirty() {
return dirty;
}
}
Gravatar #5 - arne_v
8. sep. 2013 16:23
#1

Men hvis du er villig til at restrukturere lidt så tror jeg at du skal erstatte JLabel + JTextField listen med en JTable.
Gravatar #6 - arne_v
8. sep. 2013 16:23
#1

Og så er Swing jo forældet om et halvt år.

JavaFX !!!!
Gravatar #7 - Vandmand
8. sep. 2013 17:14
#5
Jeg har slet ikke skrevet den del endnu, saa det vil ikke vaere et problem. Jeg var ikke klar over der var en JTable klasse, men det lyder som noget der passer bedre i det her tilfaelde (saa den laeser jeg lige op paa)

#6
Det vidste jeg ikke engang, jeg har ikke rigtig sat mig ind i fremtiden for Java, da dette hoejst sandsynligt bliver det sidste Java kode jeg vil bruge tid paa. Programmet skal dog vaere faerdig om et par uger, og jeg satser paa det aldrig skal opdateres (aldrig og aldrig), og stoerstedelen af de brugere der kunne taenkes at benytte det (5-10 personer) har alligevel Java 6 installeret (pga kompabilitet med andre systemer).

#4
Har ikke laest det grundigt igennem endnu, men det var et alternativ til at benytte JTable, right?
Gravatar #8 - Vandmand
8. sep. 2013 17:26
Lige et lidt mere konkret eksempel, den tabel med flest kolonner der skal bruges, består af følgende kolonner (det er en slags ugeskema):
id (int), personId (int), week (int), mandag (char), tirsdag (char), onsdag (char), torsdag (char), fredag (char)

De første tre skal ikke nødvendigvis vises, men skal jeg bruge for at tilknytte skemaet til den rette person, for den rette uge. De sidste 5 (mandag til fredag) skal vises, kunne ændres, og gemmes igen.

Er en JTable det bedste til dette formål?
Gravatar #9 - arne_v
8. sep. 2013 17:55
Vandmand (7) skrev:
Har ikke laest det grundigt igennem endnu, men det var et alternativ til at benytte JTable, right?


Ja

Vandmand (8) skrev:
Er en JTable det bedste til dette formål?


Hvis data er en tabel med N raekker og M kolonner alta "rektanhulaer", så er JTable en mulighed. Du kan godt have tomme felter i en JTable.
Gravatar #10 - arne_v
8. sep. 2013 17:57
Vandmand (7) skrev:
Det vidste jeg ikke engang, jeg har ikke rigtig sat mig ind i fremtiden for Java, da dette hoejst sandsynligt bliver det sidste Java kode jeg vil bruge tid paa. Programmet skal dog vaere faerdig om et par uger, og jeg satser paa det aldrig skal opdateres (aldrig og aldrig), og stoerstedelen af de brugere der kunne taenkes at benytte det (5-10 personer) har alligevel Java 6 installeret (pga kompabilitet med andre systemer).


Man kan godt lave JavaFX i Java 6, hvis man bruger et separat JavaFX library.

Og jeg er gelerelt meget skeptisk overfor "aldrig opdateres", men du kender konteksten bedre end mig.
Gravatar #11 - Vandmand
8. sep. 2013 18:22
#10

'aldrig opdateres' skal selvfølgelig tages med en gran salt. Jeg regner med at holde det hele på et par hundrede linjer kode, og da der ikke skal tilføjes funktionalitet, regner jeg kun med at der skal små fejlrettelser til.

Jeg kan da lige uddybe hvad jeg er i gang med:

Dette er et administrationsværktøj til et antal informationsskærme, der viser vagtplaner og generel information for forskellige afdelinger. Der sidder en lille system koblet til hver skærm med en browser der så viser en HTML5 side med data trukket fra databasen. Det er noget der skal være strikket sammen i løbet af et par uger (og erstatter et lignende system, hvor data er hardcoded i html dokumentet, og brugeren manuelt skal redigere i det).

Det er dog kun et midlertidigt system, da jeg har et større system på tegnebrættet med flere muligheder end blot vagtplaner og tekst, men også videoklip, billedgallerier osv., og en 'editor' til at tilføje data, og vælge layout. Og en masse andet.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login