| Författare |
Inlägg |
|
|
Jaxy
Blev medlem: Jan 16, 2010
Inlägg: 30
Offline
|
Hej, världen!
Jag har kört fast ordentligt i mitt labbande och behöver tankehjälp för att hamna på rätt väg.
Jag har en applikation där jag måste se till att inga dubletter av sträng värden läggs till i ett objekt av en JComboBox som innehåller i sin konstruktor en array av flera klassobjekt som innehåller flera olika parametrar data såsom strängar, booleaner och heltalsvärden.
Om min combobox bara skulle bestå av strängar såsom värden i en array eller en vektor hade jag skrivit något liknande som nedanstående exempel för att undvika dubletter av sträng-värden ...
////////////////////////
// @author Jaxy ////
//////////////////////
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Insets;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.DefaultListModel;
import javax.swing.JPanel;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JOptionPane;
public class ComboBoxProblem1 extends JPanel implements ActionListener {
public Vector<String> stringVector1;
public JComboBox jComboBox1;
public JButton jButton1,jButton2;
public JList jList1;
public DefaultListModel listModel1;
public JScrollPane jScrollPane1;
public ComboBoxProblem1() {
setLayout(new GridBagLayout());
add(new JLabel("Stad"), new GridBagConstraints(0,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
stringVector1 = new Vector<String>();
jComboBox1 = new JComboBox(stringVector1);
add(jComboBox1,new GridBagConstraints(1,0,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
jButton1 = new JButton("Ny stad");
jButton1.addActionListener(this);
add(jButton1,new GridBagConstraints(2,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
jButton2 = new JButton("Lägg till");
jButton2.addActionListener(this);
add(jButton2,new GridBagConstraints(3,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
listModel1 = new DefaultListModel();
jList1 = new JList(listModel1);
jScrollPane1 = new JScrollPane(jList1);
add(jScrollPane1,new GridBagConstraints(0,1,4,1,GridBagConstraints.BOTH,
GridBagConstraints.BOTH,GridBagConstraints.NORTH,GridBagConstraints.BOTH,
new Insets(3,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(jButton1)) {
String city = (String) JOptionPane.showInputDialog(ComboBoxProblem1.this,"Namnet på staden","Ny stad",
JOptionPane.PLAIN_MESSAGE,null,null,null);
if (city == null) return;
else if (!stringVector1.contains(city)) {
stringVector1.addElement(city);
jComboBox1.setSelectedItem(stringVector1.lastElement());
}
}
if (e.getSource().equals(jButton2)) {
String value = (String) jComboBox1.getSelectedItem();
if (value == null) return;
if (!listModel1.contains(value)) {
listModel1.addElement(value);
}
else if (listModel1.contains(value)) {
//Visa felmeddelande för användaren om att staden denne försöker lägga
//till i listan redan finns ...
}
int index = jComboBox1.getSelectedIndex();
jComboBox1.removeItemAt(index);
}
}
@Override
public Insets getInsets() {
return new Insets(3,3,3,3);
}
}
|
Istället för en vektor som tar en sträng som data vill jag använda mig av CityData objekt så att det blir som följande ....
Vector<CityData> dataVector1 = new Vector<CityData>();
JComboBox jComboBox1 = new JComboBox(dataVector1);
//Men problemet uppstår när jag vill validera datan inne i CityData objeketet så att inga dubbla värden av stadens namn läggs till i
comboboxen.
// Eller så kan jag använda en DefaultComboBoxModel
DefaultComboBoxModel model = new DefaultComboBoxModel(cityDataObjects);
// Har provat med en ListDataEvent men även där inte kommit på rätt spår
|
Jag är väldigt osäker på hur man bäst ska hantera sträng värden som ingår såsom en variabel i en konstruktor för en data definierande klass i en vektor som den i ovanstående exempel. Hur gör jag då för att undivka dubletter av stad-strängen? innan den läggs till i JListan ? I stället för en sträng vill jag lägga till ett objekt som definierar data för stad, kommun, riktnummer, befolkning osv som i nedanstående exempel ...
class CityData {
public String namn; //Detta värde ska inte kunna ta några dubletter
public String kommun;
public Double riktnummer;
public int befolkning;
public CityData(String namn, String kommun, Double riktnummer,
int befolkning) {
this.namn = namn;
this.kommun = kommun;
this.riktnummer = riktnummer;
this.befolkning = befolkning;
}
@Override
public String toString() { return namn; } // Ska visas i listan ...
}
|
Jag har provat labba med olika klasser i util paketet för att iterera mig genom datan i listmodellen och kolla upp om användaren lagt till en stad i listan med samma namn tidigare men jag har misslyckats jämt. Hur ska jag skapa objekt av data där jag vill undvika dubletter av strängvärden ? Jag står något på lägre mellan stadiet kunskapsmässigt. Hoppas iaf att jag inte är helt otydlig i vad jag vill ha hjälp med.
|
|
|
 |
|
|
Lime
Blev medlem: Feb 21, 2007
Inlägg: 490
Offline
|
Titta lite på Collectionsklasserna och se om det inte finns något Set att ha en samling som inte får innehålla dubbletter...
|
|
|
 |
|
|
Jaxy
Blev medlem: Jan 16, 2010
Inlägg: 30
Offline
|
tusen tack för hinten! 2B continued ...
|
|
|
 |
|
|
Jaxy
Blev medlem: Jan 16, 2010
Inlägg: 30
Offline
|
Här följer min lösning på mitt problem i ovanstående kodstycken. Det är något omredigerat men det är tänkt man ska registrera medlemmar från en databas av något slag. De medlemmar som läggs till i tabellen från JComboBox:en är tänkta att väljas för uppdateringar av olika slag ... Jag använder komponenterna i en applikation jag har på g. Lösningen är förmodligen bestående av en massa "overkills" men det är så långt jag kommit i mitt utvecklande. Tack en än gång för hinten Lime. Är öppen för kritik så håll inget tillbaka för den delen.
////////////////////
// @author Jaxy ///
///////////////////
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.util.Vector;
import java.util.Set;
import java.util.Arrays;
import java.util.HashSet;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.MatchResult;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.JScrollPane;
import javax.swing.JOptionPane;
import javax.swing.JComponent;
import javax.swing.JDialog;
public class ComboBoxProblem2 extends JPanel implements ActionListener {
public String[] counties = { "Blekinge", "Dalarna", "Gotland", "Gävleborg", "Halland", "Jämtland", "Jönköping", "Kalmar", "Kronoberg", "Norrbotten", "Skåne",
"Stockholm", "Södermanland", "Uppsala", "Värmland", "Västerbotten", "Västernorrland", "Västmanland", "Västra Götaland", "Örebro", "Östergötland" };
public Vector<Member> memberVector1,memberVector2;
public JComboBox jComboBox1,jComboBox2;
public JButton jButton1,jButton2,jButton3,jButton4;
public JTable jTable1;
public AbstractTableModel tableModel1;
public JScrollPane jScrollPane1;
public JDialog jDialog1 = null;
public JPanel jPanel1,jPanel2;
public JTextField jTextField1,jTextField2,jTextField3,jTextField4,jTextField5;
public JFrame frame;
public Pattern regexPattern1;
public Matcher regexMatcher1;
public MatchResult matchResult1;
public Set<String> dataSet;
public ComboBoxProblem2(JFrame frame) {
this.frame = frame;
this.regexPattern1 = getPattern("[[a-z][\\W]]");
this.dataSet = new HashSet<String>();
this.memberVector1 = new Vector<Member>();
this.memberVector2 = new Vector<Member>();
Arrays.sort(counties);
this.initGUI();
this.registerMemberNames();
this.registerListeners();
}
private void registerMemberNames() {
for (int i = 0; i < jComboBox1.getItemCount(); ++i) {
Member member = (Member) jComboBox1.getItemAt(i);
String name = member.toString();
if (member != null && !dataSet.contains(name)) {
dataSet.add(name);
}
}
}
private Pattern getPattern(String pattern) {
return Pattern.compile(pattern);
}
private void initGUI() {
this.setLayout(new GridBagLayout());
this.jPanel1 = getJPanel1();
this.jDialog1 = createJDialog1(jPanel1);
this.add(new JLabel("Medlem"), new GridBagConstraints(0,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.jComboBox1 = new JComboBox(memberVector1);
this.add(jComboBox1,new GridBagConstraints(1,0,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.HORIZONTAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.jButton1 = new JButton("Ny medlem");
this.add(jButton1,new GridBagConstraints(2,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.jButton2 = new JButton("Välj");
this.add(jButton2,new GridBagConstraints(3,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.tableModel1 = getTableModel();
this.jTable1 = new JTable(tableModel1);
this.jScrollPane1 = new JScrollPane(jTable1);
this.add(jScrollPane1,new GridBagConstraints(0,1,4,1,GridBagConstraints.BOTH,
GridBagConstraints.BOTH,GridBagConstraints.NORTH,GridBagConstraints.BOTH,
new Insets(3,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
}
public AbstractTableModel getTableModel() {
final String[] columnNames = { "Förnamn", "Efternamn", "E-post", "Väg", "Postkod", "Län" };
tableModel1 = new AbstractTableModel() {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) { return false; }
@Override
public String getColumnName(int columnIndex) { return columnNames[columnIndex]; }
@Override
public int getColumnCount() { return columnNames.length; }
@Override
public int getRowCount() { return memberVector2 == null ? 0 : memberVector2.size(); }
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Member member = (Member) memberVector2.elementAt(rowIndex);
switch (columnIndex) {
case 0: return member.fname;
case 1: return member.lname;
case 2: return member.email;
case 3: return member.street;
case 4: return member.zipCode;
case 5: return member.county;
}
return null;
}
};
return tableModel1;
}
private void registerListeners() {
this.jButton1.addActionListener(this);
this.jButton2.addActionListener(this);
this.jButton3.addActionListener(this);
this.jButton4.addActionListener(this);
this.jDialog1.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
if (jDialog1.isShowing()) {
jDialog1.requestFocusInWindow();
jDialog1.setAlwaysOnTop(true);
frame.setEnabled(false);
}
}
@Override
public void windowClosing(WindowEvent e) {
if (!frame.isEnabled()) {
frame.setEnabled(true);
}
jDialog1.dispose();
}
});
this.jTextField5.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
boolean isValidZipCode = true;
String str1 = jTextField5.getText().toLowerCase();
if (str1.length() != 0) {
regexMatcher1 = regexPattern1.matcher(str1);
while (regexMatcher1.find()) {
matchResult1 = regexMatcher1.toMatchResult();
String str2 = matchResult1.group();
jTextField5.setText(str1.replaceAll(str2,""));
}
}
}
});
}
void p(Object obj) { System.out.println(obj); }
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(jButton1)) {
jButton1ActionPerformed();
}
if (e.getSource().equals(jButton2)) {
jButton2ActionPerformed();
}
if (e.getSource().equals(jButton3)) {
jButton3ActionPerformed();
}
if (e.getSource().equals(jButton4)) {
jButton4ActionPerformed();
}
}
private void jButton1ActionPerformed() {
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
jTextField4.setText("");
jTextField5.setText("");
jComboBox2.setSelectedIndex(0);
if (!jDialog1.isShowing()) {
jDialog1.setVisible(true);
}
}
private void jButton2ActionPerformed() {
int index = jComboBox1.getSelectedIndex();
if (index == -1) return;
String name = (String) ((Member) jComboBox1.getItemAt(index)).toString();
if (name == null) return;
Member member = (Member) jComboBox1.getSelectedItem();
if (member != null && isNotAdded(member)) {
updateTableRows(member);
}
}
public boolean isNotAdded(Member member) {
for (int i = 0; i < memberVector2.size(); ++i) {
String str = (String) ((Member) memberVector2.elementAt(i)).toString();
if (str.equals(member.fname + " " + member.lname)) {
return false;
}
}
return true;
}
public void updateTableRows(Member member) {
if (member == null) return;
memberVector2.addElement(member);
tableModel1.fireTableStructureChanged();
tableModel1.fireTableDataChanged();
tableModel1.fireTableRowsInserted(tableModel1.getRowCount(),tableModel1.getColumnCount());
}
private void jButton3ActionPerformed() {
String fname = (String) jTextField1.getText();
String lname = (String) jTextField2.getText();
String email = (String) jTextField3.getText();
String street = (String) jTextField4.getText();
String zipCode = (String) jTextField5.getText();
String county = (String) jComboBox2.getSelectedItem();
boolean isValidEntry = (fname.length() != 0 && !fname.startsWith(" ")
&& lname.length() != 0 && !lname.startsWith(" ")) ? true : false;
if (isValidEntry && email != null && street != null && zipCode != null && county != null) {
memberVector1.addElement(new Member(fname,lname,email,street,zipCode,county));
jComboBox1.setSelectedItem(memberVector1.lastElement());
String memberName = fname + " " + lname;
if (!dataSet.contains(memberName)) {
dataSet.add(memberName);
}
}
jButton4ActionPerformed();
}
private void jButton4ActionPerformed() {
if (jDialog1.isShowing()) {
frame.setEnabled(true);
java.awt.Toolkit.getDefaultToolkit().beep();
jDialog1.dispose();
}
}
public JDialog createJDialog1(JComponent jComponent1) {
jDialog1 = new JDialog();
jDialog1.setSize(500,300);
jDialog1.setTitle("Ny medlem");
jDialog1.setContentPane(jComponent1);
java.awt.Dimension dim = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = dim.width / 2 - frame.getSize().width / 2;
int y = dim.height / 2 - frame.getSize().height / 2;
jDialog1.setLocation(x,y);
return jDialog1;
}
public JPanel getJPanel1() {
jPanel1 = new JPanel(new GridBagLayout());
jPanel1.add(new JLabel("Förnamn"), new GridBagConstraints(0,0,3,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.WEST,GridBagConstraints.VERTICAL,
new Insets(5,5,3,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
jTextField1 = new JTextField();
jPanel1.add(jTextField1,new GridBagConstraints(1,0,3,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(5,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel1.add(new JLabel("Efternamn"), new GridBagConstraints(0,1,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.WEST,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
jTextField2 = new JTextField();
jPanel1.add(jTextField2,new GridBagConstraints(1,1,3,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel1.add(new JLabel("E-post"), new GridBagConstraints(0,2,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
jTextField3 = new JTextField();
jTextField3.setPreferredSize(jTextField3.getMinimumSize());
jPanel1.add(jTextField3,new GridBagConstraints(1,2,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel1.add(new JLabel("Väg"), new GridBagConstraints(0,3,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
jTextField4 = new JTextField();
jTextField4.setPreferredSize(jTextField4.getMinimumSize());
jPanel1.add(jTextField4,new GridBagConstraints(1,3,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel1.add(new JLabel("Postkod"), new GridBagConstraints(0,4,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
jTextField5 = new JTextField();
jTextField5.setPreferredSize(jTextField5.getMinimumSize());
jPanel1.add(jTextField5,new GridBagConstraints(1,4,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel1.add(new JLabel("Län"), new GridBagConstraints(0,5,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
jComboBox2 = new JComboBox(counties);
jComboBox2.setPreferredSize(jComboBox2.getMinimumSize());
jPanel1.add(jComboBox2,new GridBagConstraints(1,5,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
jPanel2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
jPanel1.add(jPanel2,new GridBagConstraints(0,10,4,1,GridBagConstraints.BOTH,
GridBagConstraints.BOTH,GridBagConstraints.SOUTH,GridBagConstraints.HORIZONTAL,
new Insets(0,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
jButton3 = new JButton("OK");
jButton3.setMargin(new Insets(3,25,3,25));
jPanel2.add(jButton3);
jButton4 = new JButton("Avbryt");
jButton4.setMargin(new Insets(3,15,3,15));
jPanel2.add(jButton4);
return jPanel1;
}
////////////////////////////////////////////////////////////
/// Åberopa metoden errorMsg utifall man vill underrätta användaren om att denne
// fyllt i textfältet Postkod med felaktiga värden. Metoden är ännu inte implementerad
// Jag använde mig av en Pattern istället ...
//
// private void errorMsg(String msg) {
// JOptionPane.showMessageDialog(frame,msg,"Ett fel inträffade!",JOptionPane.PLAIN_MESSAGE);
//}
////////////////////////////////////////////////////
class Member {
public String fname,lname,email,street,zipCode,county;
public Member(String fname, String lname, String email, String street, String zipCode, String county) {
this.fname = fname;
this.lname = lname;
this.email = email;
this.street = street;
this.zipCode = zipCode;
this.county = county;
}
@Override
public String toString() { return fname + " " + lname; }
}
@Override
public Insets getInsets() {
return new Insets(3,3,3,3);
}
}
|
|
|
|
 |
|
|
Lime
Blev medlem: Feb 21, 2007
Inlägg: 490
Offline
|
Hej,
jag har några små åsikter. Tar dem i fallande ordning över hur viktig jag tycker de är.
1. Metoden "getValueAt(int rowIndex, int columnIndex)" hade renderat dig i ett stort "Code review failed due to not following normal coding standards" om de vore projektkod i något av mina projekt. Orsaken är att en metod skall innehålla en och endast en return-sats. (Ja, det finns undantag men i 99% av fallen så är det så). Så här skulle jag skriva den.
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
String returnValue ="-undefined-";
Member member = (Member) memberVector2.elementAt(rowIndex);
switch (columnIndex) {
case 0:
returnValue=member.fname;
break;
case 1:
returnValue=member.lname;
break;
case 2:
returnVaklue=member.email;
break;
case 3:
returnValue=member.street;
break;
case 4:
returnValue=member.zipCode;
break;
case 5:
returnValue=member.county;
break;
default:
returnValue="invalid index";
}
return returnValue;
}
|
2. Vector är en gammal 1.1-klass och är fullt trådsäkrat. Det betyder att den är ganska så långsam. Jag skulle använda en ArrayList istället.
3. Din array counties har du två vägar att gå med. Den ena är att deklarera den som static final. Den kommer inte att ändra på sig med mindre än att regerigen säger sitt. Den andra är att göra om det till en egen enum-klass. Jag skulle göra den senare, för då kan man göra en massa andra roligheter.
4. Namngivning. Det är svårt att följa i koden vad gör jButton1, jButton2. Beskrivande namn, som "jBtnNewMember", "jBtnChoose" och "jBtnOK", "JBtnCancel" blir lättare att arbeta med. Samma sak gäller för alla variabler. Försök att skriva ditt program så att det är så läsbart som möjigt för en programmerare.
5. Fundera om du verkligen behöver deklarera alla JTextField som variabler eller om de kan vara anonyma.
6. Ska klassen "Member" gå att skapa utan att man validerar det som kommer in??
|
|
|
 |
|
|
Jaxy
Blev medlem: Jan 16, 2010
Inlägg: 30
Offline
|
package jaxy;
////////////////////////////////////////////////////////////////////////////////////
//
// Ett "enkelt" exempel på att fylla en JComboBox med data från en JDialog klass
// som sedan ska uppdateras i en JTable för diverse syften. Komponenterna ingår
// i ett litet program jag har på g. Jag är en äldre rookie så detta exempel
// innehåller bristfälligheter och overkills men jag försöker bekämpa desssa
// så gott som min kunskap räcker till. Tack ändå för feedbacken man fått.
//
// Jaxy
//
///////////////////////////////////////////////////////////////////////////////////
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.awt.FlowLayout;
import java.awt.Insets;
import java.util.Set;
import java.util.Arrays;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.MatchResult;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.event.TableModelListener;
import javax.swing.event.TableModelEvent;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.JComboBox;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.JScrollPane;
import javax.swing.JOptionPane;
import javax.swing.JComponent;
import javax.swing.JDialog;
public class ComboBoxProblem2 extends JPanel implements ActionListener {
public final String[] counties = { "Blekinge", "Dalarna", "Gotland", "Gävleborg", "Halland", "Jämtland", "Jönköping", "Kalmar", "Kronoberg", "Norrbotten", "Skåne",
"Stockholm", "Södermanland", "Uppsala", "Värmland", "Västerbotten", "Västernorrland", "Västmanland", "Västra Götaland", "Örebro", "Östergötland" };
public ArrayList<Member> tableDataListener;
public JButton jBtnNewMember,jBtnChooseMember,jBtnOK,jBtnCancel,jBtnDeleteComboItem,jBtnDeleteTableRow;
public JTable jTbMember;
public JComboBox jComboMember,jComboCounties;
public AbstractTableModel memberTableModel;
public JDialog memberDialog = null;
public JLabel jLbStatus;
public JPanel jDialogMainPanel,okCancelPanel;
public JTextField jTxFirstName,jTxLastName,jTxEmail,jTxStreet,jTxZipCode;
public JFrame frame;
public Pattern regexPattern1;
public Matcher regexMatcher1;
public MatchResult matchResult1;
public Set<String> memberListener;
public String initialStatusText = "Vald medlem: ";
public ComboBoxProblem2(JFrame frame) {
this.frame = frame;
this.initVars();
this.createGUI();
this.registerMemberNames();
this.registerListeners();
}
private void initVars() {
this.tableDataListener = new ArrayList<Member>();
this.memberListener = new HashSet<String>();
this.jTxFirstName = new JTextField();
this.jTxLastName = new JTextField();
this.jTxEmail = new JTextField();
this.jTxStreet = new JTextField();
this.jTxZipCode = new JTextField();
this.jComboCounties = new JComboBox(counties);
this.jBtnOK = new JButton("OK");
this.jBtnOK.setMargin(new Insets(3,25,3,25));
this.jBtnOK.setFocusable(false);
this.jBtnCancel = new JButton("Avbryt");
this.jBtnCancel.setMargin(new Insets(3,15,3,15));
this.jBtnCancel.setFocusable(false);
this.jDialogMainPanel = new JPanel(new GridBagLayout());
this.jDialogMainPanel.setPreferredSize(jDialogMainPanel.getMinimumSize());
this.memberDialog = createDialog(jDialogMainPanel);
this.jBtnNewMember = new JButton("Ny medlem");
this.jBtnNewMember.setFocusable(false);
this.jBtnChooseMember = new JButton("Välj");
this.jBtnChooseMember.setFocusable(false);
this.jBtnDeleteComboItem = new JButton("Ta bort");
this.jBtnDeleteComboItem.setEnabled(false);
this.jBtnDeleteComboItem.setFocusable(false);
this.jBtnDeleteTableRow = new JButton("Ta bort markerad rad");
this.jBtnDeleteTableRow.setEnabled(false);
this.jBtnDeleteTableRow.setFocusable(false);
this.memberTableModel = getTableModel();
this.jTbMember = new JTable(memberTableModel);
this.jTbMember.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.jComboMember = new JComboBox();
this.jLbStatus = new JLabel();
this.jLbStatus.setText(initialStatusText);
}
private void registerMemberNames() {
for (int i = 0; i < jComboMember.getItemCount(); ++i) {
Member member = (Member) jComboMember.getItemAt(i);
if (!memberListener.contains(member.toString())) {
memberListener.add(member.toString());
}
}
}
private void createGUI() {
this.setLayout(new GridBagLayout());
this.add(new JLabel("Medlem"), new GridBagConstraints(0,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jComboMember,new GridBagConstraints(1,0,1,1,
GridBagConstraints.BOTH,GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.BOTH,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jBtnNewMember,new GridBagConstraints(2,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jBtnChooseMember,new GridBagConstraints(3,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,3),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jBtnDeleteComboItem,new GridBagConstraints(4,0,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.NORTH,GridBagConstraints.VERTICAL,
new Insets(0,0,0,1),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(new JScrollPane(jTbMember),new GridBagConstraints(0,1,5,1,GridBagConstraints.BOTH,
GridBagConstraints.BOTH,GridBagConstraints.NORTH,GridBagConstraints.BOTH,
new Insets(3,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jLbStatus,new GridBagConstraints(0,2,2,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.WEST,GridBagConstraints.VERTICAL,
new Insets(3,1,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.add(jBtnDeleteTableRow,new GridBagConstraints(2,2,3,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.EAST,GridBagConstraints.VERTICAL,
new Insets(3,0,0,1),GridBagConstraints.NONE,GridBagConstraints.NONE));
}
public AbstractTableModel getTableModel() {
final String[] columnNames = { "Förnamn", "Efternamn", "E-post", "Väg", "Postkod", "Län" };
memberTableModel = new AbstractTableModel() {
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) { return false; }
@Override
public String getColumnName(int columnIndex) { return columnNames[columnIndex]; }
@Override
public int getColumnCount() { return columnNames.length; }
@Override
public int getRowCount() { return tableDataListener == null ? 0 : tableDataListener.size(); }
//Är inte bekväm med att använda metoden @setValueAt(Object, int, int) men jag antar den är till
//för att utvärdera data i tabellstrukturen
@Override
public void setValueAt(Object obj, int columnIndex, int rowIndex) {
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
String returnValue = "N/A";
Member member = (Member) tableDataListener.get(rowIndex);
switch (columnIndex) {
case 0:
returnValue=member.fname;
break;
case 1:
returnValue=member.lname;
break;
case 2:
returnValue=member.email;
break;
case 3:
returnValue=member.street;
break;
case 4:
returnValue=member.zipCode;
break;
case 5:
returnValue=member.county;
break;
default:
returnValue="N/A";
}
return returnValue;
}
};
return memberTableModel;
}
private void registerListeners() {
this.jBtnNewMember.addActionListener(this);
this.jBtnChooseMember.addActionListener(this);
this.jBtnDeleteComboItem.addActionListener(this);
this.jBtnOK.addActionListener(this);
this.jBtnCancel.addActionListener(this);
this.jBtnDeleteTableRow.addActionListener(this);
//Registrera en fönsterstängare
this.memberDialog.addWindowListener(new WindowAdapter() {
@Override
public void windowActivated(WindowEvent e) {
if (memberDialog.isShowing()) {
memberDialog.requestFocusInWindow();
memberDialog.setAlwaysOnTop(true);
frame.setEnabled(false);
}
}
@Override
public void windowClosing(WindowEvent e) {
if (!frame.isEnabled()) {
frame.setEnabled(true);
}
memberDialog.dispose();
}
});
//Registrera en TableModelListener som håller koll på de olika
//händelserna i tabellstrukturen ...
this.memberTableModel.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent e) {
if (e.getType() == TableModelEvent.INSERT) {
jBtnDeleteTableRow.setEnabled(true);
}
else if (e.getType() == TableModelEvent.DELETE) {
jBtnDeleteTableRow.setEnabled(false);
}
}
});
this.jTbMember.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
jLbStatus.setText(initialStatusText);
int row = jTbMember.getSelectedRow();
if (row != -1) {
Member member = (Member) tableDataListener.get(row);
jLbStatus.setText(initialStatusText + member.toString());
jBtnDeleteTableRow.setEnabled(true);
}
}
});
this.jTxZipCode.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String inputString = jTxZipCode.getText();
regexPattern1 = Pattern.compile("\\D", Pattern.CASE_INSENSITIVE);
regexMatcher1 = regexPattern1.matcher(inputString);
while (regexMatcher1.find()) {
jTxZipCode.setText(regexMatcher1.replaceAll("").trim());
}
}
});
}
void p(Object obj) { System.out.println(obj); }
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(jBtnNewMember)) {
this.jBtnNewMemberPressed();
}
if (e.getSource().equals(jBtnChooseMember)) {
this.jBtnChooseMemberPressed();
}
if (e.getSource().equals(jBtnDeleteComboItem)) {
this.jBtnDeleteComboItemPressed();
}
if (e.getSource().equals(jBtnOK)) {
this.jBtnOKPressed();
}
if (e.getSource().equals(jBtnCancel)) {
this.jBtnCancelPressed();
}
if (e.getSource().equals(jBtnDeleteTableRow)) {
this.jBtnDeleteTableRowPressed();
}
}
private void jBtnNewMemberPressed() {
this.jTxFirstName.setText("");
this.jTxLastName.setText("");
this.jTxEmail.setText("");
this.jTxStreet.setText("");
this.jTxZipCode.setText("");
this.jComboCounties.setSelectedIndex(0);
this.jBtnNewMember.setEnabled(false);
if (!memberDialog.isShowing()) {
this.memberDialog.setVisible(true);
}
}
private void jBtnChooseMemberPressed() {
Member member = (Member) jComboMember.getSelectedItem();
if (member == null) return;
if (!tableDataListener.contains(member)) {
this.insertMemberIntoTable(member);
}
}
private void jBtnDeleteComboItemPressed() {
Member member = (Member) jComboMember.getSelectedItem();
if (member != null) {
this.jBtnDeleteComboItem.setEnabled(true);
this.jComboMember.removeItem(member);
this.memberListener.remove(member.toString());
if (jComboMember.getItemCount() == 0) {
this.jBtnDeleteComboItem.setEnabled(false);
this.jLbStatus.setText(initialStatusText);
}
}
}
public void insertMemberIntoTable(Member member) {
this.tableDataListener.add(member);
this.memberTableModel.fireTableStructureChanged();
this.memberTableModel.fireTableDataChanged();
this.memberTableModel.fireTableRowsInserted(0, memberTableModel.getRowCount());
}
private void jBtnOKPressed() {
String fname = jTxFirstName.getText();
String lname = jTxLastName.getText();
String email = jTxEmail.getText();
String street = jTxStreet.getText();
String zipCode = jTxZipCode.getText();
String county = (String) jComboCounties.getSelectedItem();
Member member = new Member(fname,lname,email,street,zipCode,county);
if (member == null) return;
if (isValidEntry(fname) && isValidEntry(lname) && !comboBoxContainsMember(member)) {
this.jComboMember.addItem(member);
this.jBtnNewMember.setEnabled(true);
this.jBtnDeleteComboItem.setEnabled(true);
this.jComboMember.setSelectedItem(member);
}
this.jBtnCancelPressed();
}
private void jBtnCancelPressed() {
if (memberDialog.isShowing()) {
this.frame.setEnabled(true);
java.awt.Toolkit.getDefaultToolkit().beep();
this.memberDialog.dispose();
}
this.jBtnNewMember.setEnabled(true);
}
private void jBtnDeleteTableRowPressed() {
int index = tableDataListener.size();
int row = jTbMember.getSelectedRow();
if (row == -1) return;
if (index != 0 || row != -1) {
this.tableDataListener.remove(row);
this.memberTableModel.fireTableStructureChanged();
this.memberTableModel.fireTableDataChanged();
this.memberTableModel.fireTableRowsDeleted(row,index);
}
this.jLbStatus.setText(initialStatusText);
}
private boolean comboBoxContainsMember(Member memberObject1) {
int index = jComboMember.getItemCount();
for (int i = 0; i < index; ++i) {
Member memberObject2 = (Member) jComboMember.getItemAt(i);
if (memberObject2.toString().equals(memberObject1.toString())) {
return true;
}
else {
return false;
}
}
return false;
}
private boolean isValidEntry(String value) {
if(value.length() != 0 && !value.startsWith(" ") && value != null) {
return true;
}
else {
return false;
}
}
public JDialog createDialog(JComponent component) {
this.memberDialog = new JDialog();
this.memberDialog.setSize(500,300);
this.memberDialog.setTitle("Ny medlem");
this.memberDialog.setContentPane(component);
this.populateJDialogMainPanel(component);
java.awt.Dimension dim = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
int x = dim.width / 2 - frame.getSize().width / 2;
int y = dim.height / 2 - frame.getSize().height / 2;
this.memberDialog.setLocation(x,y);
return memberDialog;
}
public void populateJDialogMainPanel(JComponent component) {
component.add(new JLabel("Förnamn"), new GridBagConstraints(0,0,3,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.WEST,GridBagConstraints.VERTICAL,
new Insets(5,5,3,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jTxFirstName,new GridBagConstraints(1,0,3,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(5,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(new JLabel("Efternamn"), new GridBagConstraints(0,1,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.WEST,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jTxLastName,new GridBagConstraints(1,1,3,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(new JLabel("E-post"), new GridBagConstraints(0,2,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jTxEmail,new GridBagConstraints(1,2,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(new JLabel("Väg"), new GridBagConstraints(0,3,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jTxStreet,new GridBagConstraints(1,3,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(new JLabel("Postkod"), new GridBagConstraints(0,4,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jTxZipCode,new GridBagConstraints(1,4,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(new JLabel("Län"), new GridBagConstraints(0,5,1,1,GridBagConstraints.NONE,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.VERTICAL,
new Insets(0,5,3,10),GridBagConstraints.NONE,GridBagConstraints.NONE));
component.add(jComboCounties,new GridBagConstraints(1,5,1,1,GridBagConstraints.BOTH,
GridBagConstraints.NONE,GridBagConstraints.LINE_START,GridBagConstraints.BOTH,
new Insets(0,0,3,5),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.okCancelPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
this.jDialogMainPanel.add(okCancelPanel,new GridBagConstraints(0,10,4,1,GridBagConstraints.BOTH,
GridBagConstraints.BOTH,GridBagConstraints.SOUTH,GridBagConstraints.HORIZONTAL,
new Insets(0,0,0,0),GridBagConstraints.NONE,GridBagConstraints.NONE));
this.okCancelPanel.add(jBtnOK);
this.okCancelPanel.add(jBtnCancel);
}
////////////////////////////////////////////////////////////
//
// Åberopa metoden errorMsg utifall man vill underrätta användaren om att denne
// fyllt i textfältet Postkod med felaktiga värden. Metoden är ännu inte implementerad
// Jag använde mig istället av en Pattern en stränghanteringsteknik som påminner mig om
// den i olika skriptspråk
//
// private void errorMsg(String msg) {
// JOptionPane.showMessageDialog(frame,msg,"Ett fel inträffade!",JOptionPane.PLAIN_MESSAGE);
// }
//
////////////////////////////////////////////////////
class Member {
public String fname,lname,email,street,zipCode,county;
public Member(String fname, String lname, String email, String street, String zipCode, String county) {
this.fname = fname;
this.lname = lname;
this.email = email;
this.street = street;
this.zipCode = zipCode;
this.county = county;
}
@Override
public String toString() { return fname + " " + lname; }
}
@Override
public Insets getInsets() {
return new Insets(3,4,4,3);
}
|
Lime jag förstod inte riktigt vad du menade med att använda sig en enum i hantering av Member instanserna. Menade du en public enum Member eller Enumeration. Jag är osäker på enum hantering har inte kommit så långt att jag använder denna regelbundet. Vore tacksam för exempel eller länkar till tutorials som tar upp detta. //Jaxy.
|
|
|
 |
|
|
|
|