Avatar billede DummeDitte Nybegynder
14. maj 2010 - 17:29 Der er 6 kommentarer og
1 løsning

Abstractformatter eller anden løsning på objects i JTextField

Jeg har en formular.
I formularen er der et JTextField.

Jeg har en klasse der hedder Deltager.
I Deltager-klassen er der en metode der hedder toString.

Hvordan får jeg JTextField'et til at acceptere et objekt og selv bruge toString til at hente en String for objektet?
Altså, så jeg kan skrive jtextfield.setText(deltager)?
(hvor jtextfield selvfølgelig er en instans af JTextField, og deltager tilsvarende for Deltager)

Jeg har googlet mig frem til, at jeg skulle kunne bruge JFormattedTextField med en AbstractFormatter - men jeg kan ikke finde ud af hvordan.
Så nu vælger jeg den (nemme) løsning, og spørger jer!

På forhånd tak!
Avatar billede arne_v Ekspert
14. maj 2010 - 17:31 #1
Hvorfor kan du ikke bruge:

jtextfield.setText(deltager.toString());

?
Avatar billede arne_v Ekspert
14. maj 2010 - 17:38 #2
Men ellers kan jeg nok hurtigt bixe et eksempel med JFormattedTextField
Avatar billede DummeDitte Nybegynder
14. maj 2010 - 17:38 #3
Fordi jeg skal bruge deltager-objektet fra textfield'et når der bliver trykket på en knap - og ikke kun toString-teksten.
Avatar billede arne_v Ekspert
14. maj 2010 - 18:01 #4
Det her virker uden formatter:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;

public class Formatting extends JFrame {
    private JFormattedTextField jftf;
    private JButton jbtn;
    public Formatting() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Formatting");
        jftf = new JFormattedTextField();
        jftf.setValue(new Foobar(177));
        getContentPane().add(jftf, BorderLayout.CENTER);
        jbtn = new JButton("Test");
        jbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ((Foobar)jftf.getValue()).test();
            }
        });
        getContentPane().add(jbtn, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new Formatting();
                f.setVisible(true);
            }
        });
    }
}

class Foobar {
    private int v;
    public Foobar(int v) {
        this.v = v;
    }
    public int getV() {
        return v;
    }
    public void setV(int v) {
        this.v = v;
    }
    @Override
    public String toString() {
        return Integer.toString(v);
    }
    public void test() {
        JOptionPane.showMessageDialog(null, "v=" + v);
    }
}
Avatar billede DummeDitte Nybegynder
14. maj 2010 - 18:11 #5
Arh - setValue for JFormattedTF er tricket!
Fantastisk!

Nemt og dejligt - og jeg burde have set det selv, men det er vel det man har eksperter til!;o)

Svare du?
Avatar billede arne_v Ekspert
14. maj 2010 - 18:27 #6
svar
Avatar billede arne_v Ekspert
14. maj 2010 - 18:43 #7
Hvis du gerne vil se en formatter in action saa:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.JFormattedTextField.AbstractFormatter;
import javax.swing.JFormattedTextField.AbstractFormatterFactory;

public class Formatting2 extends JFrame {
    private JFormattedTextField jftf;
    private JButton jbtn;
    public Formatting2() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        setTitle("Formatting");
        jftf = new JFormattedTextField();
        jftf.setFormatterFactory(new AbstractFormatterFactory() {
            @Override
            public AbstractFormatter getFormatter(JFormattedTextField tf) {
                return new AbstractFormatter() {
                    @Override
                    public Object stringToValue(String text) throws ParseException {
                        if(text.equals("")) return null;
                        return new Foobar2(Integer.parseInt(text.substring(4, text.length()-4)));
                    }
                    @Override
                    public String valueToString(Object value) throws ParseException {
                        if(value == null) return "";
                        if(value instanceof Foobar2) {
                            return "****" + ((Foobar2)value).getV() + "****";
                        } else {
                            throw new RuntimeException(value.getClass().getName() + " is not supported");
                        }
                    }
                };
            }
           
        });
        jftf.setValue(new Foobar2(177));
        getContentPane().add(jftf, BorderLayout.CENTER);
        jbtn = new JButton("Test");
        jbtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                ((Foobar2)jftf.getValue()).test();
            }
        });
        getContentPane().add(jbtn, BorderLayout.SOUTH);
        pack();
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new Formatting2();
                f.setVisible(true);
            }
        });
    }
}

class Foobar2 {
    private int v;
    public Foobar2(int v) {
        this.v = v;
    }
    public int getV() {
        return v;
    }
    public void setV(int v) {
        this.v = v;
    }
    @Override
    public String toString() {
        return Integer.toString(v);
    }
    public void test() {
        JOptionPane.showMessageDialog(null, "v=" + v);
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester