Avatar billede trp79 Nybegynder
17. april 2003 - 20:18 Der er 35 kommentarer og
1 løsning

Lave awt klasse om til swing (textfield -> jtextfield)

Jeg har denne klasse jeg godt vil have lavet om så den virker med swing istedet for. Det skal altså være et JTextField som kun accepterer tal.

import java.awt.*;
import java.awt.event.*;

public class NumberTextField extends TextField implements KeyListener
{
    NumberTextField(){this(10);}

    NumberTextField(int sendSize)
    {
        super(sendSize);
        this.addKeyListener(this);
    }

    public void keyPressed (KeyEvent ke)
    {
        if (!ke.isActionKey() && ke.getKeyCode()!=KeyEvent.VK_DELETE && ke.getKeyCode()!=KeyEvent.VK_BACK_SPACE)
            // Tjek om keyCode er et tal?
            if (ke.getKeyCode()<KeyEvent.VK_0 || ke.getKeyCode()>KeyEvent.VK_9) {
                // Hvis nej consume()
                ke.consume();
        }
    }
    public void keyReleased(KeyEvent ke){}
    public void keyTyped(KeyEvent ke){}
}

Jeg har prøvet at extende med JTextField istedet for, men det virkede ikke. Dvs. den kunne godt compile og køre programmet men man kunne taste det ind man ville :o(
Avatar billede arne_v Ekspert
17. april 2003 - 20:47 #1
public void keyTyped(KeyEvent ke){
        if((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) {
            ke.consume();
        }
    }

ser ud til at virke bedre.
Avatar billede trp79 Nybegynder
17. april 2003 - 21:34 #2
Det virker jo fint Arne :o)
Er der et sted man kan se KeyChar's?
Avatar billede trp79 Nybegynder
17. april 2003 - 21:37 #3
Jeg leder specielt efter Delete og Back_space
Avatar billede arne_v Ekspert
17. april 2003 - 21:38 #4
getKeyChar returnerer regulær char d.v.s. 'a' er 'a'.

(keyTypes bliver så vidt jeg har forstået kun kaldt for
key der faktisk skriver noget, så der er ikke behov for koder)
Avatar billede arne_v Ekspert
17. april 2003 - 21:44 #5
Ah.

    public void keyTyped(KeyEvent ke){
        if(ke.getKeyChar() != 8) {
            if((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) {
                ke.consume();
            }
        }
    }

BackSpace er 8.
Avatar billede arne_v Ekspert
17. april 2003 - 21:46 #6
Delete synes ikke at triggere en keyTyped.

(SUN JVM 1.3.1 pÅ Windows 2000)

Men ellers er Delete 127.
Avatar billede trp79 Nybegynder
17. april 2003 - 21:47 #7
Kan man se et sted hvad 0-9 betyder så? nu er backspace så 8...
Avatar billede trp79 Nybegynder
17. april 2003 - 21:49 #8
Okey det var så de to jeg skulle bruge :o)
De andre er mest af nysgerrighed.... der er så åbenbart langt mere en 0-9!
Avatar billede trp79 Nybegynder
17. april 2003 - 21:53 #9
Den brokker sig over 127:o(
unclosed character literal
            if((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9') || (ke.getKeyChar() > '8') || (ke.getKeyChar() > '127')) {
Avatar billede arne_v Ekspert
17. april 2003 - 21:58 #10
Jeg tror du mener:

if(((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) && (ke.getKeyChar() != 8) && (ke.getKeyChar() != 127)) {
Avatar billede trp79 Nybegynder
17. april 2003 - 22:00 #11
Ja selvfølgelig... nogen gange bør man nok tænke lidt før man taster et spørgsmål...
Mange tak for hjælpen, og god påske.

Mvh
Torben
Avatar billede trp79 Nybegynder
17. april 2003 - 22:48 #12
Lige en sidste ting, du ved vel ikke hvad koden er for enter/return ?
Avatar billede arne_v Ekspert
17. april 2003 - 22:51 #13
Jeg formoder den er 13.
Avatar billede arne_v Ekspert
17. april 2003 - 22:52 #14
Jeg prøvede lige.

I mit setup returneres der 10.

Jeg foreslår at du tester både på 10 og 13.
Avatar billede trp79 Nybegynder
17. april 2003 - 22:59 #15
Har lige test det...
Det er 10 (på en bærbar comp) ved ikke om 13 så måske er Enter ved det nummeriske keyboard på et alm. tastetur.

Desværre hjalp det ikke, jeg har en JDialog hvor jeg har 2 textfields (af ovenstående slags), en JComboks og så en JBotton.
Jeg har sat en Enter som default button, men det virker desværre ikke sammen med disse textfields... har du nogen ide om hvordan jeg kan løse problemet?
Avatar billede arne_v Ekspert
18. april 2003 - 09:48 #16
Det er svært udfra de foreliggende oplsyninger.

(jeg er heller ikke nogen Swing haj)

Kan du post et stykke kode som har problemet ?
Avatar billede arne_v Ekspert
18. april 2003 - 09:51 #17
Jeg checkede iøvrigt lige.

Du kan godt bruge:
  KeyEvent.VK_BACK_SPACE
  KeyEvent.VK_DELETE
  KeyEvent.VK_ENTER
sammen med ke.getKeyChar og derved undgå 8, 127 og 10 !
Avatar billede trp79 Nybegynder
18. april 2003 - 10:41 #18
Jeg har lige prøvet med de KeyEvents du har postet, men det virkede desværre heller ikke :o( Men koden kommer lige her:

    private void jDialogAddOms()
    {
            addOms = new JDialog(this, "Tilføj Omsætning", true);
            addOms.setSize(260,180);
            initJDialogAddOms();

            Dimension selfBounds = addOms.getSize();
            addOms.setLocation((screenSize.width - selfBounds.width) / 2, (screenSize.height - selfBounds.height) / 2);

            addOms.pack();
              addOms.setSize(260,180);
              addOms.setVisible(true);
    }

    private void initJDialogAddOms()
    {
        JLabel lAddOmsBeloeb = new javax.swing.JLabel();
        JLabel lAddKPFirma = new javax.swing.JLabel();
        JLabel lAddOmsAar = new javax.swing.JLabel();
        final JTextField jTFAddOmsAar = new NumberTextField();
        final JTextField jTFAddOmsBeloeb = new NumberTextField();
        JButton jBAddOms = new javax.swing.JButton();
        JLabel lAddOmsOverskrift = new javax.swing.JLabel();
        final JComboBox jCBoxAddOmsFirma = new javax.swing.JComboBox();

        addOms.getContentPane().setLayout(null);

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                addOms.setVisible(false);
                addOms.dispose();
            }
        });

        lAddOmsBeloeb.setToolTipText("Størrelsen af omsætning");
        lAddOmsBeloeb.setFont(new java.awt.Font("Arial", 1, 10));
        lAddOmsBeloeb.setText("Oms.");
        addOms.getContentPane().add(lAddOmsBeloeb);
        lAddOmsBeloeb.setBounds(20, 80, 41, 20);

        lAddKPFirma.setToolTipText("Firmaet omsætningen er tilknyttet");
        lAddKPFirma.setFont(new java.awt.Font("Arial", 1, 10));
        lAddKPFirma.setText("Firma");
        addOms.getContentPane().add(lAddKPFirma);
        lAddKPFirma.setBounds(20, 40, 41, 20);

        lAddOmsAar.setToolTipText("Året for omsætningen");
        lAddOmsAar.setFont(new java.awt.Font("Arial", 1, 10));
        lAddOmsAar.setText("\u00c5r");
        addOms.getContentPane().add(lAddOmsAar);
        lAddOmsAar.setBounds(20, 60, 41, 20);

        jTFAddOmsAar.setToolTipText("Året for omsætningen");
        jTFAddOmsAar.setFont(new java.awt.Font("Arial", 0, 10));
        addOms.getContentPane().add(jTFAddOmsAar);
        jTFAddOmsAar.setBounds(60, 60, 130, 20);

        jTFAddOmsBeloeb.setToolTipText("Størrelsen af omsætning");
        jTFAddOmsBeloeb.setFont(new java.awt.Font("Arial", 0, 10));
        addOms.getContentPane().add(jTFAddOmsBeloeb);
        jTFAddOmsBeloeb.setBounds(60, 80, 130, 20);

        jBAddOms.setToolTipText("Tilf\u00f8j omsætning med overst\u00e5ende oplysninger");
        jBAddOms.setFont(new java.awt.Font("Arial", 1, 10));
        jBAddOms.setText("Tilf\u00f8j");
        addOms.getContentPane().add(jBAddOms);
        jBAddOms.setBounds(90, 110, 70, 20);
        addOms.getRootPane().setDefaultButton( jBAddOms );

        lAddOmsOverskrift.setText("Tilf\u00f8j Oms\u00e6tning");
        lAddOmsOverskrift.setFont(new java.awt.Font("Arial Black", 1, 18));
        addOms.getContentPane().add(lAddOmsOverskrift);
        lAddOmsOverskrift.setBounds(30, 0, 190, 30);

        jCBoxAddOmsFirma.setToolTipText("Firmaet omsætningen er tilknyttet");
        addOms.getContentPane().add(jCBoxAddOmsFirma);
        jCBoxAddOmsFirma.setBounds(60, 40, 130, 20);

        for(int j=0;j<firmaListe.size();j++)        //Tilføjer firmer til combobksen
          jCBoxAddOmsFirma.addItem(firmaListe.get(j));

          jCBoxAddOmsFirma.setSelectedItem(firma);

        jBAddOms.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                Firma f = (Firma)jCBoxAddOmsFirma.getSelectedItem(); //henter firma objektet ned fra comboboksen
                boolean ikkeTom=true;

                if(jTFAddOmsAar.getText().equals("") || jTFAddOmsBeloeb.getText().equals("") || f==null)
                {
                    JOptionPane.showMessageDialog(null, "Du skal angive: firma, år og omsætningen", "Angivelse mangler", JOptionPane.INFORMATION_MESSAGE);
                    jTFAddOmsAar.requestFocus();
                    ikkeTom=false;
                }

                else if(m.findesOms(omsListe, jTFAddOmsAar.getText(), "", f.getNavn()))  //Findes en omsætning til et år til det pågældendee firma i forvejen?
                {
                    JOptionPane.showMessageDialog(null, f.getNavn() +" har omsætning for "+ jTFAddOmsAar.getText(), "Omsætning findes i forvejen", JOptionPane.INFORMATION_MESSAGE);
                    jTFAddOmsAar.requestFocus();
                    ikkeTom=false;
                }

                if(ikkeTom)
                {
                    date = new Date();
                    Omsaetning temp = new Omsaetning(jTFAddOmsAar.getText(), f, jTFAddOmsBeloeb.getText(), df.format(date));
                    omsListe.add(temp);    //Personen tilføjes til arraylisten kPListe
                    omsListModel.removeAllElements(); //Jlist for personer nulstilles
                    updateJListOms(); //Jlist for personer opdateres med de personer der er tilknyttet det markerede firma.
                    jTFAddOmsAar.setText("");
                    jTFAddOmsBeloeb.setText("");
                    jTFAddOmsAar.requestFocus();
                    ikkeTom=true;
                    addOms.setVisible(false);
                    addOms.dispose();
                }
            }
        });
    }
Avatar billede trp79 Nybegynder
18. april 2003 - 10:44 #19
Jeg kan prøve at ligge programmet op som i en non mangle version hvis det vil gære det nemmere?
Vi skal vist have fundet ud af noget med nogle ekstra points her, vi er jo ved at være et godt stykke over, hvad spørgsmålet egentlig gik ud på...
Avatar billede arne_v Ekspert
18. april 2003 - 10:48 #20
VK'erne gør præcis det samme om tallene.

Så det ændrer ikke på funktionaliteten. Det er kun for kode læsbarhedens
skyld.
Avatar billede arne_v Ekspert
18. april 2003 - 10:49 #21
Jeg tror at noget komplet kode jeg kan køre vil gøre det nemmere.
Avatar billede arne_v Ekspert
18. april 2003 - 10:50 #22
Og lad os snakke om point, når det virker !

:-)
Avatar billede trp79 Nybegynder
18. april 2003 - 11:01 #23
Ok :o)
Koden incl en eksekverbar jar fil kan hentes på www.confunded.dk/tp/arne.zip
Avatar billede trp79 Nybegynder
18. april 2003 - 11:05 #24
Noget er koden af desværre lavet på et tidspunkt hvor det ikke var gået op for at man ved parameter overførsel af komplekse datatyper arbejder med adresser og ikke kopierer fx objektet :o( Så især rasmus.java er meget uoverskuelig :o(

Run, er den klasse hvori main ligger.
Rasmus, er den klasse hvor mine JDialogs ligger i.

De textfelter jeg har brugt NumberTextField på er ved tilføjelse af budget og oms, samt redigering af budget og oms.
Man kan højreklikke på jlistene....
Avatar billede trp79 Nybegynder
18. april 2003 - 11:17 #25
Hvis det er for uoverskuelig skal du bare sige til. Det er bare en kammerat jeg er ved at lave programmet for, han kan nok leve med at man er nød til at trykke på knappen...
Avatar billede arne_v Ekspert
18. april 2003 - 11:17 #26
Du har stadigvæk:

    public void keyPressed (KeyEvent ke)
    {
        if (!ke.isActionKey() && ke.getKeyCode()!=KeyEvent.VK_DELETE && ke.getKeyCode()!=KeyEvent.VK_BACK_SPACE)
            // Tjek om keyCode er et tal?
            if (ke.getKeyCode()<KeyEvent.VK_0 || ke.getKeyCode()>KeyEvent.VK_9) {
                // Hvis nej consume()
                ke.consume();
        }
    }

og den "æder" returns !
Avatar billede arne_v Ekspert
18. april 2003 - 11:18 #27
retur kalder slet ikke keyTyped kun keyPressed.

Bogstaver og tal kalder begge.
Avatar billede arne_v Ekspert
18. april 2003 - 11:21 #28
Men ja koden kunne måske godt bruge en omgang refactoring.

2276 linier i en .java fil er lidt voldsomt.
Avatar billede trp79 Nybegynder
18. april 2003 - 11:25 #29
Forrygende Arne! Det havde jeg slet ikke skænket en tanke. Troede godt den måtte være der når det ikke virkede med JTextField. Men det måtte det ikke...

Ja specielt mine JDialog burde jo have lagt i filer for sig selv, så var der da omkring 1000 linier mindre kode i rasmus.java......

Hvor meget siger man "normalt" man må have i en klasse? Det er nok et lidt abstrakt spørgsmål...
Avatar billede trp79 Nybegynder
18. april 2003 - 11:26 #30
Skulle vi lige finde ud af noget med lidt point? Jeg ville i hvert fald aldrig selv har fundet ud af det....
Avatar billede _carsten Nybegynder
18. april 2003 - 11:31 #31
Jeg har siddet og leget lidt her på sidelinien og er nået frem til en som kun accepterer indtastning af tal, er det noget der er til noget ??


public class Test_KunTal extends javax.swing.JFrame {
   
    /** Creates new form Test_KunTal */
    public Test_KunTal() {
        initComponents();
        jTextField1.setText("");
       
    }
   

    private void initComponents() {//GEN-BEGIN:initComponents
        jTextField1 = new HeleTalTextField(0,10);

        getContentPane().setLayout(new java.awt.FlowLayout());

        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        jTextField1.setColumns(10);
        getContentPane().add(jTextField1);

        pack();
    }//GEN-END:initComponents


    private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
        System.exit(0);
    }//GEN-LAST:event_exitForm
   

    public static void main(String args[]) {
        new Test_KunTal().show();
    }
   
   
    private javax.swing.JTextField jTextField1;
   
}






import javax.swing.*;
import javax.swing.text.*;

import java.awt.Toolkit;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class HeleTalTextField extends JTextField {
    private Toolkit toolkit;
    private NumberFormat integerFormatter;

    public HeleTalTextField(int value, int columns) {
        super(columns);
        toolkit = Toolkit.getDefaultToolkit();
        integerFormatter = NumberFormat.getNumberInstance(Locale.US);
        integerFormatter.setParseIntegerOnly(true);
        setValue(value);
    }

    public int getValue() {
        int retVal = 0;
        try {
            retVal = integerFormatter.parse(getText()).intValue();
        } catch (ParseException e) {
            // This should never happen because insertString allows
            // only properly formatted data to get in the field.
            toolkit.beep();
        }
        return retVal;
    }

    public void setValue(int value) {
        setText(integerFormatter.format(value));
    }

    protected Document createDefaultModel() {
        return new HeleTal();
    }

    protected class HeleTal extends PlainDocument {
        public void insertString(int offs,
                                String str,
                                AttributeSet a)
                throws BadLocationException {
            char[] source = str.toCharArray();
            char[] result = new char[source.length];
            int j = 0;

            for (int i = 0; i < result.length; i++) {
                if (Character.isDigit(source[i]))
                    result[j++] = source[i];
                else {
                    toolkit.beep();
                }
            }
            super.insertString(offs, new String(result, 0, j), a);
        }
    }
}
Avatar billede arne_v Ekspert
18. april 2003 - 11:33 #32
Java Code Convention fra SUN siger bare:

"Files longer than 2000 lines are cumbersome and should be avoided."

http://www.csc.calpoly.edu/~gfisher/classes/206/handouts/design-imple-conventions.html
siger:

  1. No method may be longer than 25 lines, except as noted below. The 25-line length does not include comments and blank lines.

  2. No class may have more than 25 public methods plus 25 protected methods, i.e., no more than 50 methods total. If a class has fewer that 25 public methods, it may have up to 50 methods total, however it may never have more than 25 public methods. Typically classes should have far fewer than 50 methods total.
  4. Note that combining the 25-line rule with the 50-method rule means that no .java file can be longer the 1250 lines of code, excluding comments. Typically, .java files should have far fewer than 1250 lines.
Avatar billede arne_v Ekspert
18. april 2003 - 11:33 #33
Personligt vil jeg nok helst holde .java filer under 500 linier.
Avatar billede arne_v Ekspert
18. april 2003 - 11:37 #34
Me dhensyn til point så kan du lave et et spørgsmål med overskrift
"Point til arne_v" i denne kategori med et link til dette spørgsmål
i selve spørgsmålet.

Så svarer jeg på det og alle er glade.
Avatar billede trp79 Nybegynder
18. april 2003 - 11:38 #35
Her er lige lidt point til dig Arne:
http://www.eksperten.dk/spm/341811

--> carsten
Vi fandt ud af det med denne klasse:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NumberTextField extends JTextField implements KeyListener
{
    NumberTextField(){this(10);}

    NumberTextField(int sendSize)
    {
        super(sendSize);
        this.addKeyListener(this);
    }

    public void keyPressed (KeyEvent ke)
    {}
    public void keyReleased(KeyEvent ke){}
    public void keyTyped(KeyEvent ke){
            if(((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) && (ke.getKeyChar() != ke.VK_DELETE) && (ke.getKeyChar() != ke.VK_BACK_SPACE) && (ke.getKeyChar() != ke.VK_ENTER) ) {
            //if(((ke.getKeyChar() < '0') || (ke.getKeyChar() > '9')) && (ke.getKeyChar() != 8) && (ke.getKeyChar() != 127) && (ke.getKeyChar() != 10) ) {
                {System.out.println("e");
                ke.consume();}
            }
    }
}
Så ellers tak :o)
Avatar billede _carsten Nybegynder
18. april 2003 - 11:40 #36
OK
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