Problem z prostą klasą

0
class Obliczenie implements ActionListener
{
   public void actionPerformed(ActionEvent zdarzenie)
   {
      long m=Integer.parseInt(pole.getText());  
       
      if (m>0) {
          if (liczba1>0) {
              
          pole.setText(" ");
              
              if (rodzaj==1) {
float suma=(float)liczba1+m;
pole.setText(""+suma+""); 
  }
       if (rodzaj==2) { 
float roznica=(float)liczba1-m; 
pole.setText(""+roznica+""); 
 }
       if (rodzaj==3) { 
float iloczyn=(float)liczba1*m; 
pole.setText(""+iloczyn+"");
 }
       
       if (rodzaj==4) {  

float iloraz=(float)liczba1/m; 
pole.setText(""+iloraz+"");  }   
              
          }
          
      }
       
       
       
       
   }
    
}

Mam problem z klasą obliczenie. Jest to akcja wykonana po naciśnięciu jbutton (przy kompilacji nie ma problemu)

A i rodzaj jest to zmienna int zadeklarowana w ogólnej klasie. Przypisanie wartości rodzaj 1,2,3 lub 4 następuje po naciśnięciu innego buttona

0

Problem, ale nie napisałeś jaki.

0
xception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: " 2"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:447)
        at java.lang.Integer.parseInt(Integer.java:497)
        at kalkulator.MojPanel$wynik.actionPerformed(Program.java:155)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6134)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
        at java.awt.Component.processEvent(Component.java:5899)
        at java.awt.Container.processEvent(Container.java:2023)
        at java.awt.Component.dispatchEventImpl(Component.java:4501)
        at java.awt.Container.dispatchEventImpl(Container.java:2081)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
        at java.awt.Container.dispatchEventImpl(Container.java:2067)
        at java.awt.Window.dispatchEventImpl(Window.java:2458)
        at java.awt.Component.dispatchEvent(Component.java:4331)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
0

Ale ten kod muszę dać do klasy czy do zdarzenia naciskania klawisza ? (jak będzie wyglądał kod programu ? )

0

Z artykułu:

Znacznie lepszym rozwiązaniem jest przerzucenie odpowiedzialności za przyjmowane znaki na obiekt textField. Najprostszym sposobem na dokonanie tego jest dodanie odpowiedniego obiektu nasłuchującego (ang. listener) do naszego pola:

Dodajesz ten kod do swojego pola tekstowego.

0

IMO, opisany w artykule sposób jest zły. Po pierwsze jest nieodporny na wypełnienie pola tekstowego za pośrednictwem schowka (Ctrl-V), po drugie jest nieodporny na przekroczenie zakresu. W obu wypadkach generowane są nieobsłużone wyjątki. Szybkość działania programu przy wprowadzaniu liczb w pola tekstowe nie jest najważniejsza, ważniejsza jest kontrola poprawności wprowadzanych danych. Napisałem własną klasę (pole tekstowe na małym panelu), panel zmienia kolor w zależności od tego czy pole tekstowe nie ma fokusu, ma fokus, ma fokus i wpisana liczba jest błędna (wychodzi poza podany w konstruktorze zakres). Tekstu, którego nie można sparsować nie da się ani wpisać, ani wkleić ze schowka. Nie da się też zdjąć fokusu jeśli zawartość pola tekstowego jest nieodpowiednia.
pozdrawiam

0

dzięki bogdans, będą poprawki i rozwinięcie tego kodu.

0

Koziołek, jak chcesz sprawdzać czy wpisany ciąg cyfr nie tworzy liczby większej od Integer.MAX_VALUE bez parsowania ? Chyba jednak sposoby z parsowaniem i obsługą wyjątków są najwygodniejsze. Mogę napisać artykuł opisujący mój (oparty o parsowanie i obsługę wyjątków) sposób.

0

No to co panowie proponujecie ? Użyć tego kodu czy czekać na publikacje Waszego kodu ?

0

@bogdans, a la perl:

public class app {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String a = Integer.MAX_VALUE + "";
		String b = "000000032423";
		String c = "2147483648";
		String d = "2147483646";
		System.out.println("Warunek 1: liczba jest 'krótsza' niż MAX_VALUE");
		System.out.println(a.length() <= b.replaceFirst("0*", "").length());
		System.out.println(a.length() <= c.length());
		System.out.println(a.length() <= c.length());
		System.out.println("Warunek 2: porównujemy liczby jak wyrazy");
		System.out.println(a.compareTo(b.replaceFirst("0*", "")));
		System.out.println(a.compareTo(c));
		System.out.println(a.compareTo(d));
		System.out
				.println("oba warunki: Liczba jest 'dłuższa' niż MAX_VALUE i jest większa w porównaniu stringów");
		porownaj(a, b);
		porownaj(a, c);
		porownaj(a, d);
	}

	private static void porownaj(String a, String b) {
		if (!(a.length() <= b.replaceFirst("0*", "").length())) {
			System.out.println(b + " jest mniejsze niż " + a);
		}
		if (a.compareTo(b.replaceFirst("0*", "")) > 0) {
			System.out.println(b + " jest mniejsze niż " + a);
		}
		else{
			System.out.println(b + " jest większe lub równe niż " + a);
		}
	}
}

Trochę to toporne, ale działa bez wyjątków... no i nie uwzględnia ujemnych, ale to szczegół do nadrobienia.

0

@JavaProblem, nie mam dzisiaj czasu na pisanie artykułu. Jak Ci nie przeszkadza konstrukcja try/catch i Koziołek mnie nie rozstrzela za zaśmiecanie forum, to mogę kod klasy i przykład zastosowania umieścić na forum.
pozdrawiam

0

Nie rozstrzelam, bo jak widze forum jest lepsze w rankingach wyszukiwania niż serwis. Zresztą kod można przenieść do artykułu jako dodatek i inne podejście.

0

Najpierw przykład zastosowania:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JSumator extends JFrame implements ActionListener
{
    private JInputInteger pierwsza,druga,trzecia;
    private JInputInteger suma=new JInputInteger();
    //------------------------
    public static void main(String args[])
    {
    	new JSumator();
    }
    //------------------------
    public JSumator()
    {
    	super("Wprowadzanie liczb całkowitych");
        setLayout(new BorderLayout());

        JButton przycisk=new JButton("Sumowanie");
        przycisk.setBackground(Color.lightGray);
        przycisk.addActionListener(this);
        add("North",przycisk);

        JPanel panel=new JPanel();
        panel.setLayout(new GridLayout(4,2,10,10));
        add("Center",panel);
        JLabel label=new JLabel("Wpisz dowolną liczbę całkowitą");
        panel.add(label);
        pierwsza=new JInputInteger();
        pierwsza.addActionListener(this);
        panel.add(pierwsza);
        label=new JLabel("Wpisz liczbę z zakresu od 0 do 88");
        panel.add(label);
        druga=new JInputInteger(0,88);
        druga.addActionListener(this);
        panel.add(druga);
        label=new JLabel("Wpisz liczbę z zakresu od -100 do 100");
        panel.add(label);
        trzecia=new JInputInteger(-100,100);
        trzecia.addActionListener(this);
        panel.add(trzecia);
        panel.add(new JLabel("Suma"));
        suma.setEditable(false);
        panel.add(suma);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
        pierwsza.setFocus();
    }
    //------------------------
    public void actionPerformed(ActionEvent ae)
    {
    	int s=0;
        s+=pierwsza.getValue();
        s+=druga.getValue();
        s+=trzecia.getValue();
        suma.setText(""+s);
    }
}

Teraz klasa JInputInteger

/* Klasa usługowa do wprowadzania liczb całkowitch (typu int).
 * Liczby są wprowadzane w polu tekstowym umieszonym na panelu.
 * Panel zmienia kolor w zależności od tego czy pole tekstowe
 * ma fokus, czy wpisany ciąg jest liczbą całkowitą i czy ta
 * liczba mieści się w podanym zakresie.
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;

public class JInputInteger extends JPanel
{
    private JTextField tf;
    private int gr_dolna,gr_gorna,szer=12;
    private Color nofocus=new Color(211,211,211);
    private Color focus=new Color(203,203,250);
    private Color error=new Color(235,176,105);
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,Color nofocus,Color focus,Color error,String startValue)
    {
        super();
        this.gr_dolna=gr_dolna;
        this.gr_gorna=gr_gorna;
        this.nofocus=nofocus;
        this.focus=focus;
        this.error=error;
        setBackground(nofocus);
        tf=new JTextField(startValue,szer);
        tf.setEditable(true);
        JIntControler sprawdzacz=new JIntControler(gr_dolna,gr_gorna,nofocus,focus,error);
        tf.addFocusListener(sprawdzacz);
        AbstractDocument doc=(AbstractDocument) tf.getDocument();
        doc.setDocumentFilter(new IsInteger(gr_dolna,gr_gorna,nofocus,focus,error,tf));
        add(tf);
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,Color nofocus,Color focus,Color error)
    {
        this(gr_dolna,gr_gorna,nofocus,focus,error,"");
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna)
    {
        this(gr_dolna,gr_gorna,new Color(211,211,211),new Color(203,203,250),new Color(235,176,105),"");
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,String startValue)
    {
        this(gr_dolna,gr_gorna,new Color(211,211,211),new Color(203,203,250),new Color(235,176,105),startValue);
    }
    //------------------------
    public JInputInteger()
    {
        this(Integer.MIN_VALUE,Integer.MAX_VALUE);
    }
    //------------------------
    public int getValue()
    {
        String txt=tf.getText();
        if (txt.equals(""))
        {
            return 0;
        }
        else
        {
            int i=0;
       	    try
       	    {
                i=Integer.parseInt(txt);
       	    }
       	    catch (NumberFormatException e)
       	    {
       	    }
       	    return i;
        }
    }
    //------------------------
    public void addActionListener(ActionListener al)
    {
        tf.addActionListener(al);
    }
    //------------------------
    public void addKeyListener(KeyListener kl)
    {
        tf.addKeyListener(kl);
    }
    //------------------------
    public void setEditable(boolean isEditable)
    {
        tf.setEditable(isEditable);
    }
    //------------------------
    public void setFocus()
    {
        tf.requestFocus();
    }
    //------------------------
    public void requestFocus()
    {
        tf.requestFocus();
    }
    //------------------------
    public void setText(String s)
    {
        tf.setText(s);
    }
    //------------------------
    public String getText()
    {
        return tf.getText();
    }
    //------------------------
    public void selectAll()
    {
        tf.selectAll();
    }
    //------------------------
    public void setActionCommand(String cmd)
    {
        tf.setActionCommand(cmd);
    }
}
//------------------------------------------------
class JIntControler implements FocusListener
{
    private int gr_dolna,gr_gorna;
    private Color nofocus,focus,error;
    //------------------------
    JIntControler(int grd,int grg,Color nofocus,Color focus,Color error)
    {
        gr_dolna=grd;
        gr_gorna=grg;
        this.nofocus=nofocus;
        this.focus=focus;
        this.error=error;
    }
    //------------------------
    public void focusGained(FocusEvent fe)
    {
        JTextField tf=(JTextField) fe.getSource();
        Container cont=tf.getParent();
        if (!isGood(tf))
        {
       	    cont.setBackground(error);
        }
        else
        {
       	    cont.setBackground(focus);
        }
        cont.repaint();
    }
    //------------------------
    public void focusLost(FocusEvent fe)
    {
        JTextField tf=(JTextField) fe.getSource();
        Container cont=tf.getParent();
        if (!isGood(tf))
        {
            cont.setBackground(error);
        }
        else
        {
       	    cont.setBackground(nofocus);
        }
        cont.repaint();
    }
    //------------------------
    private boolean isGood(JTextField tf)
    {
        String old=tf.getText();
        int i=0;
        Container cont=tf.getParent();
        if (old.equals(""))
        {
            if(0>=gr_dolna && 0<=gr_gorna)
            {
                return true;
            }
            else
            {
       	        cont.getToolkit().beep();
                cont.setBackground(error);
                cont.repaint();
                tf.requestFocus();
                return false;
            }
        }
        try
        {
       	    i=Integer.parseInt(old);
        }
        catch (NumberFormatException e)
        {
       	    cont.getToolkit().beep();
            cont.setBackground(error);
            cont.repaint();
            tf.requestFocus();
            return false;
        }
        if (i>=gr_dolna && i<=gr_gorna)
        {
       	    return true;
        }
        else
        {
       	    cont.getToolkit().beep();
            cont.setBackground(error);
            cont.repaint();
            tf.requestFocus();
            return false;
        }
    }
}

Jeszcze klasa IsInteger wykorzystywana przy kontroli co jest kopiowane ze schowka

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;

public class IsInteger extends DocumentFilter
{
    private int minValue;
    private int maxValue;
    private Color nofocus;
    private Color focus;
    private Color error;
    private JTextField tf;
    //------------------------
    public IsInteger(int minValue,int maxValue,Color nofocus,Color focus,Color error,JTextField tf)
    {
        this.minValue=minValue;
        this.maxValue=maxValue;
        this.nofocus=nofocus;
        this.focus=focus;
        this.error=error;
        this.tf=tf;
    }
    //------------------------
    private boolean isOk(String s)
    {
        int i=0;
        if (s.equals(""))
        {
            return true;
        }
        try
        {
            i=Integer.parseInt(s);
        }
        catch (NumberFormatException e)
        {
            return false;
        }
        if (i<minValue || i>maxValue)
        {
            return false;
        }
        return true;
    }
    //------------------------
    public void insertString(FilterBypass fb,int offs,String str,AttributeSet a)
           throws BadLocationException
    {
       	super.insertString(fb,offs,str,a);
       	skontroluj();
    }
    //------------------------
    public void replace(FilterBypass fb,int offs,int length,String str,AttributeSet a)
           throws BadLocationException
    {
       	super.replace(fb,offs,length,str,a);
       	skontroluj();
    }
    //------------------------
    public void remove(FilterBypass fb,int offs,int length) throws BadLocationException
    {
       	super.remove(fb,offs,length);
        skontroluj();
    }
    //------------------------
    private void skontroluj()
    {
       	Container parent=tf.getParent();
       	String s=tf.getText();
       	if (isOk(s))
       	{
            parent.setBackground(focus);
       	}
       	else
       	{
            parent.setBackground(error);
       	}
    }
}
0

Ten ostatni link prowadzi do lekko niekompletnego kodu, który też jest dość słabo napisany.
Wystarczy choćby zauważyć, że:

if(a) x()
else if(b) x();
else if(c) x();
else if(d) x();

Skraca się banalnie do:

if(a || b || c || d) x();

albo

if(a == true && b == false) x();

skraca się do bardziej czytelnego:

if(a && !b) x();
0

Dzięki ale mam pytanie ? Jak przypisać ten kod gdy JTextField tworzony jest w konstruktorze Panel a panel jest wyglądem formy ?

pole=new JTextField("",14); 
add(pole); 

Dopiero zaczynam naukę więc.....

0

Kogo pytasz ? Jeśli mnie, to

JInputInteger pole; // deklaracja pola
......
pole=new JInputInteger();
add(pole);

Klasa JInputInteger zastępuje przy wprowadzaniu liczb typu integer klasę JTextField.

0
package kalkulator;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.*;



public class Kalkulator
{

public static void main(String args[])
{
Okno okno=new Okno(); 
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
okno.setVisible(true); 
}

}

class Okno extends JFrame 
{
public Okno() 
{
setTitle("Kalkulator"); 
setSize(200,250); 

MojPanel p=new MojPanel(); 
Container powzaw=getContentPane(); 
powzaw.add(p); 
}
}


class MojPanel extends JPanel 
{
public float liczba1, liczba2;
JInputInteger pole; // deklaracja pola 
public int rodzaj;


public class JInputInteger extends JPanel
{
    private JTextField tf;
    private int gr_dolna,gr_gorna,szer=12;
    private Color nofocus=new Color(211,211,211);
    private Color focus=new Color(203,203,250);
    private Color error=new Color(235,176,105);
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,Color nofocus,Color focus,Color error,String startValue)
    {
        super();
        this.gr_dolna=gr_dolna;
        this.gr_gorna=gr_gorna;
        this.nofocus=nofocus;
        this.focus=focus;
        this.error=error;
        setBackground(nofocus);
        tf=new JTextField(startValue,szer);
        tf.setEditable(true);
        JIntControler sprawdzacz=new JIntControler(gr_dolna,gr_gorna,nofocus,focus,error);
        tf.addFocusListener(sprawdzacz);
        AbstractDocument doc=(AbstractDocument) tf.getDocument();
        doc.setDocumentFilter(new IsInteger(gr_dolna,gr_gorna,nofocus,focus,error,tf));
        add(tf);
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,Color nofocus,Color focus,Color error)
    {
        this(gr_dolna,gr_gorna,nofocus,focus,error,"");
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna)
    {
        this(gr_dolna,gr_gorna,new Color(211,211,211),new Color(203,203,250),new Color(235,176,105),"");
    }
    //------------------------
    public JInputInteger(int gr_dolna,int gr_gorna,String startValue)
    {
        this(gr_dolna,gr_gorna,new Color(211,211,211),new Color(203,203,250),new Color(235,176,105),startValue);
    }
    //------------------------
    public JInputInteger()
    {
        this(Integer.MIN_VALUE,Integer.MAX_VALUE);
    }
    //------------------------
    public int getValue()
    {
        String txt=tf.getText();
        if (txt.equals(""))
        {
            return 0;
        }
        else
        {
            int i=0;
                   try
                   {
                i=Integer.parseInt(txt);
                   }
                   catch (NumberFormatException e)
                   {
                   }
                   return i;
        }
    }
    //------------------------
    public void addActionListener(ActionListener al)
    {
        tf.addActionListener(al);
    }
    //------------------------
    public void addKeyListener(KeyListener kl)
    {
        tf.addKeyListener(kl);
    }
    //------------------------
    public void setEditable(boolean isEditable)
    {
        tf.setEditable(isEditable);
    }
    //------------------------
    public void setFocus()
    {
        tf.requestFocus();
    }
    //------------------------
    public void requestFocus()
    {
        tf.requestFocus();
    }
    //------------------------
    public void setText(String s)
    {
        tf.setText(s);
    }
    //------------------------
    public String getText()
    {
        return tf.getText();
    }
    //------------------------
    public void selectAll()
    {
        tf.selectAll();
    }
    //------------------------
    public void setActionCommand(String cmd)
    {
        tf.setActionCommand(cmd);
    }
}
//------------------------------------------------
class JIntControler implements FocusListener
{
    private int gr_dolna,gr_gorna;
    private Color nofocus,focus,error;
    //------------------------
    JIntControler(int grd,int grg,Color nofocus,Color focus,Color error)
    {
        gr_dolna=grd;
        gr_gorna=grg;
        this.nofocus=nofocus;
        this.focus=focus;
        this.error=error;
    }
    //------------------------
    public void focusGained(FocusEvent fe)
    {
        JTextField tf=(JTextField) fe.getSource();
        Container cont=tf.getParent();
        if (!isGood(tf))
        {
                   cont.setBackground(error);
        }
        else
        {
                   cont.setBackground(focus);
        }
        cont.repaint();
    }
    //------------------------
    public void focusLost(FocusEvent fe)
    {
        JTextField tf=(JTextField) fe.getSource();
        Container cont=tf.getParent();
        if (!isGood(tf))
        {
            cont.setBackground(error);
        }
        else
        {
                   cont.setBackground(nofocus);
        }
        cont.repaint();
    }
    //------------------------
    private boolean isGood(JTextField tf)
    {
        String old=tf.getText();
        int i=0;
        Container cont=tf.getParent();
        if (old.equals(""))
        {
            if(0>=gr_dolna && 0<=gr_gorna)
            {
                return true;
            }
            else
            {
                       cont.getToolkit().beep();
                cont.setBackground(error);
                cont.repaint();
                tf.requestFocus();
                return false;
            }
        }
        try
        {
                   i=Integer.parseInt(old);
        }
        catch (NumberFormatException e)
        {
                   cont.getToolkit().beep();
            cont.setBackground(error);
            cont.repaint();
            tf.requestFocus();
            return false;
        }
        if (i>=gr_dolna && i<=gr_gorna)
        {
                   return true;
        }
        else
        {
                   cont.getToolkit().beep();
            cont.setBackground(error);
            cont.repaint();
            tf.requestFocus();
            return false;
        }
    }
}
    
public MojPanel() 
{

pole=new JInputInteger();
add(pole); 


JButton dzielenie=new JButton("/"); 
add(dzielenie); 

JButton mnozenie=new JButton("*"); 
add(mnozenie); 

JButton odejmowanie=new JButton("-"); 
add(odejmowanie);

JButton dodawanie=new JButton("+");
add(dodawanie); 

JButton ynik=new JButton("Enter");
add(ynik);

 ActionListener wyn=new wynik();
 ynik.addActionListener(wyn);

ActionListener dod=new Dodaj(); 
dodawanie.addActionListener(dod); 

ActionListener ode=new Odejmij(); 
odejmowanie.addActionListener(ode);

ActionListener mno=new Pomnoz(); 
mnozenie.addActionListener(mno); 

ActionListener dzi=new Podziel(); 
dzielenie.addActionListener(dzi); 

}


class Dodaj implements ActionListener
{
       
public void actionPerformed(ActionEvent zdarzenie) 
{                 
long liczben=Integer.parseInt(pole.getText());
liczba1=liczben;
pole.setText("");
rodzaj=1;
}
}

class Odejmij implements ActionListener
{
    
public void actionPerformed(ActionEvent zdarzenie) 
{
long liczbens=Integer.parseInt(pole.getText());
liczba1=liczbens;
pole.setText("");
rodzaj=2;
}
}

class Pomnoz implements ActionListener
{

  
public void actionPerformed(ActionEvent zdarzenie) 
{

long liczbene=Integer.parseInt(pole.getText());
liczba1=liczbene;
pole.setText("");
rodzaj=3;
}
}

class Podziel implements ActionListener
{
    
public void actionPerformed(ActionEvent zdarzenie) 
{

long liczbens = Integer.parseInt(pole.getText());
liczba1=liczbens;
pole.setText("");
rodzaj=4;
}
}

 

class wynik implements ActionListener
{       
    
      
    
  public void actionPerformed(ActionEvent zdarzenie)         
   {
      
     long m=Integer.parseInt(pole.getText()); 
     liczba2 = m;  
               
          pole.setText("");
              
              if (rodzaj==1) {
float suma=(float)liczba1+liczba2;
pole.setText(""+suma+""); 
  }
       if (rodzaj==2) { 
float roznica=(float)liczba1-liczba2; 
pole.setText(""+roznica+""); 
 }
       if (rodzaj==3) { 
float iloczyn=(float)liczba1*liczba2; 
pole.setText(""+iloczyn+"");
 }
       
       if (rodzaj==4) {  

float iloraz=(float)liczba1/liczba2; 
pole.setText(""+iloraz+"");  }   
              
          }
          
      }

       
   }

Czy ten kod jest już dobry ? Niby się kompiluje ale zwykłe litery mogę wstawiać

0

Późno odpowiadam, bo nie miałem przez parę godzin prądu. Kod jest zupełnie zły.

  • definicję (kod) klasy IsInteger zapisz w nowym pliku IsInteger.java i skompiluj ten plik
  • definicję (kod) klasy JInputInteger zapisz w nowym pliku JInputInteger.java i skompiluj ten plik
    Pozostanie dużo krótszy plik Kalkulator.java, którego nie da się skompilować (wbrew twojemu twierdzeniu) bo zawiera 20 błędów.
    pozdrawiam
</i>
0

U mnie się kompiluje program bez tych klas co podałeś kilka postów wyżej i dodaje, odejmuje, mnoży i dzieli poprawnie tylko teraz właśnie chodzi mi o zabezpieczenie żeby nie było można walić liter do komponentu

0

Tak wygląda u Ciebie definicja klasy Dodaj

class Dodaj implements ActionListener
{
       
public void actionPerformed(ActionEvent zdarzenie)
{                 
long liczben=Integer.parseInt(pole.getText());
liczba1=liczben;
pole.setText("");
rodzaj=1;
}
}

Zmienne liczba1, pole i rodzaj są niezadeklarowane, mamy trzy błędy,
Integer.parseInt() zwróci int, dlaczego zmienna liczben jest typu long ? (to nie jest błąd).

0

No jak pole i pozostałe zmienne są przecież tworzone w ogólnej klasie MojPanel.

0

Jak byś mógł to popraw mi ten kod ale dodatkowo z wytłumaczeniem bo sam dobry kod mi nic nie da.

0

@JavaProblem napisał

No jak pole i pozostałe zmienne są przecież tworzone w ogólnej klasie MojPanel.
. I co z tego, skąd klasa Dodaj ma wiedzieć z jakiego obiektu jakiej klasy pochodzi liczba1.
Zadziałałoby coś takiego:

class Dodaj implements ActionListener
{
   MojPanel mp;
   public Dodaj(MojPanel panel)
   {
       mp=panel;
   }
   public void actionPerformed(ActionEvent zdarzenie)
   {                 
      long liczben=Integer.parseInt(pole.getText());
      mp.liczba1=liczben;
      mp.pole.setText("");
      mp.rodzaj=1;
   }
}

i w klasie MojPanel

ActionListener dod=new Dodaj(this); 

Ja mam taką propozycję

//package kalkulator;

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.text.*;


public class Kalkulator
{

    public static void main(String args[])
    {
        Okno okno=new Okno();
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okno.setVisible(true);
    }
}
//------------------------------------------------
class Okno extends JFrame
{
    public Okno()
    {
        setTitle("Kalkulator");
        setSize(500,120);

        MojPanel p=new MojPanel();
        //Container powzaw=getContentPane();
        //powzaw.add(p);
        //powyższe jest konieczne dla starych wersji Javy (1.3 lub 1.4), teraz starczy tak
        add(p);
    }
}
//------------------------------------------------
class MojPanel extends JPanel implements ActionListener
{
    // obsługą zdarzeń (kliknięć w JButton) zajmie się klasa MojPanel, żeby
    // nie trzeba było przekazywać danych między klasami
    private JInputInteger pole1; // deklaracja pola
    private JInputInteger pole2; // deklaracja pola
    private JTextField wynik;
    //JTextField pole;
    //private String rodzaj; // łatwiej analizować kod gdy warunek wygląda tak if(rodzaj.equals("*"))
                           // niż gdy wygląda tak if(rodzaj==3(

    public MojPanel()
    {

        pole1=new JInputInteger();
        add(pole1);

        pole2=new JInputInteger();
        add(pole2);

        JButton b=new JButton("/");
        b.addActionListener(this);
        add(b);

        b=new JButton("*");
        b.addActionListener(this);
        add(b);

        b=new JButton("-");
        b.addActionListener(this);
        add(b);

        b=new JButton("+");
        b.addActionListener(this);
        add(b);
        
        wynik=new JTextField(40);
        wynik.setEditable(false);
        //w tym polu wyświetlimy wynik, użytkownik nie ma możliwości pisania
        add(wynik);
    }
    //------------------------
    public void actionPerformed(ActionEvent zdarzenie)
    {
        //wpierw rozpoznajemy, który przycisk został kliknięty
        //metoda getActionCommand() domyślnie zwraca napis z przycisku
        String rodzaj=zdarzenie.getActionCommand();
        //odczytujemy liczby, ponieważ suma (iloczyn) liczb typu int może nie być int (tylko long)
        //to rzutujemy żeby działania były na liczbach typu long
        long liczba1=(long)pole1.getValue();
        int liczba2=pole2.getValue();
        String result=liczba1+rodzaj+liczba2+"=";
        if(rodzaj.equals("+"))
           wynik.setText(result+(liczba1+liczba2));
        if(rodzaj.equals("-"))
           wynik.setText(result+(liczba1-liczba2));
        if(rodzaj.equals("*"))
           wynik.setText(result+(liczba1*liczba2));
        if(rodzaj.equals("/"))
           wynik.setText(result+((float)liczba1/liczba2));
    }
}

Co prawda możesz do pól wpisać inne znaki niż cyfry, ale błąd jest sygnalizowany czerwoną otoczką wokół pola tekstowego. Ponadto nie możesz z tego wyjść, w szczególności nie możesz skutecznie kliknąć w przycisk.

0

Chłopie jesteś wielki albo większy od wielkiego. Dzięki za poprawkę a szczególnie za opisanie błędów !

Mam teraz inne pytanko:
Jak mogę rozmieścić JButton i jak zablokować zmianę rozmiaru utworzonego okna ?

0

Zablokować możesz tak:

okno.setResizable(false);

Rozmieszczanie ręczne mocno odradzam, Java ma menadżery rozkładu (LayoutManager) i one powinny się zająć rozmieszczeniem. W poniższym programie, są użyte trzy, najprostsze chyba, menadżery.

import java.awt.*;
import javax.swing.*;

public class Layout extends JFrame
{
    static final int NUMBER_OF_BUTTONS=5;
    //------------------------
    public static void main(String args[])
    {
        new Layout();
    }
    //------------------------
    public Layout()
    {
        super("Zarządcy rozkładów");
        String nazwy[]={"Flow Layout","FlowLayout (left aligned)",
    	                "Border Layout","Grid Layout(1,5)",
    	                "Grid Layout(5,1)",
    	                "Grid Layout(2,3)"};
        LayoutManager lm[]={new FlowLayout(),
                            new FlowLayout(FlowLayout.LEFT),
                            new BorderLayout(),
                            new GridLayout(1,NUMBER_OF_BUTTONS),
                            new GridLayout(NUMBER_OF_BUTTONS,1),
                            new GridLayout(NUMBER_OF_BUTTONS/2,NUMBER_OF_BUTTONS%2)};
        String gb[]={"West","North","East","South","Center"};
        Color colors[]={Color.yellow,Color.blue,Color.green,
                        Color.red,Color.yellow,Color.blue};
        setLayout(new GridLayout(3,2,5,5));
        int k=0;
        for (int i=0;i<nazwy.length;i++)
        {
       	    JPanel p=new JPanel();
            p.setLayout(lm[i]);
            for (int j=0;j<NUMBER_OF_BUTTONS;j++)
            {
       	        JButton b=new JButton("P "+(j+1));
                if (i==2) // rozkład BorderLayout wymaga dwóch parametrów
                {
                    p.add(b,gb[k++]);
                }
                else
                {
                    p.add(b);
                }
            }
            JPanel pl=new JPanel();

            pl.setLayout(new BorderLayout());
            JLabel l=new JLabel(nazwy[i]+":",JLabel.CENTER);
            l.setFont(new Font("Dialog",Font.BOLD,16));
            pl.setBackground(colors[i]);
            pl.add(l,"North");
            pl.add(p,"Center");
            add(pl);
        }
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}
0

Dobra, poprawiłem kod tak jak mówiłeś i wywala mi takie błędy:

compile:
run:
Exception in thread "main" java.lang.NullPointerException
        at java.awt.Container.addImpl(Container.java:1014)
        at java.awt.Container.add(Container.java:348)
        at kalkulator.MojPanel.<init>(Kalkulator.java:47)
        at kalkulator.Okno.<init>(Kalkulator.java:31)
        at kalkulator.Kalkulator.main(Kalkulator.java:16)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
0

Nie znam twojego kodu, w tym który umieściłem na forum w 47 wierszu jest { , zatem

at kalkulator.MojPanel.<init>(Kalkulator.java:47)

nie może być tam błędu wykonania.

0

Czyli błąd musi być wewnątrz konstruktora:

public MojPanel() {

1 użytkowników online, w tym zalogowanych: 0, gości: 1