كيفية إدخال أرقام في JTextFields باستخدام نفس مجموعة الأزرار؟

StackOverflow https://stackoverflow.com/questions/4146860

سؤال

أقوم ببناء آلة حاسبة بسيطة للطرح فقط حيث z = x - y. لقد أنشأت 3 حقول نصية: X و Y و Z. سيقوم المستخدم بإدخال القيمة باستخدام لوحة المفاتيح (الأزرار) التي صممتها لـ X و Y.

فقط من خلال النظر إلى الكود أدناه ، هناك بعض المشكلات على الفور.

1) X Textfield يقبل فقط رقم واحد. (أريدها أن تقبل ما يصل إلى 3 أرقام). أي اقتراحات حول كيف يمكنني تعديل آخر إذا كان بيان لدمج ذلك؟

2) عندما انتهيت من X Textfield ، أريد أن أفعل ذلك بنفسه مع y textfield. ولكن يتم تخصيص الأزرار بدقة لحقل النص x. سيكون من غير الفعال جعل لوحة مفاتيح أخرى فقط ل y textfield. فكيف يمكنني التبديل بين حقل النص X و Y. هل هناك بعض التعليمات البرمجية حيث يكون للمستخدم المؤشر على حقل النص X ، فإن لوحة المفاتيح محفوظة لهذا الحقل X النص ، وإذا كان المستخدم يغير إلى ملعب Textfield ، فيمكن استخدام لوحة المفاتيح لـ Y ثم.

3) وبمجرد إدخال ضربات المستخدم ، فإن عملية بسيطة z = x - y. والتي يجب أن يكون من السهل تنفيذها. أي تحويل الأوتار إلى أعداد صحيحة وما إلى ذلك وأداء الفرق.

شكرا لكم جميعا مقدما!

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

    public class EmbeddedMain extends JFrame
    {
    private JTextField x,y,z;
    private JButton button1, button2, button3, button4, button5, button6, button7, button8, button9, button0, buttonR, buttonE;

        public static void main (String[] args)
            {
            EmbeddedMain em = new EmbeddedMain();
            }

        public EmbeddedMain() //constructor begins, method for embedded main class
        {
            setTitle("Subtraction");
            setSize(450,350);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setLocationRelativeTo(null);
            setLayout(new GridLayout(4,5,3,3));
            setVisible(true);   

         button1= new JButton("7");
         button2= new JButton("8");
         button3= new JButton("9");
         button4= new JButton("4");
         button5= new JButton("5");
         button6= new JButton("6");
         button7= new JButton("1");
         button8= new JButton("2");
         button9= new JButton("3");
         button0= new JButton("0");
         buttonR= new JButton("Reset");
         buttonE= new JButton("Enter");

     x = new JTextField("   ");
     y = new JTextField("   ");
     z = new JTextField("   ");
     z.setEditable(false);      

        add(button1);
        add(button2);
        add(button3);
        add(new JLabel("    x:")); 
        add(x); 
        add(button4);
        add(button5);
        add(button6);
        add(new JLabel("    y:")); 
        add(y); 
        add(button7);
        add(button8);
        add(button9);
        add(new JLabel("    z:")); 
        add(z); 
        add(buttonR);
        add(button0);
        add(buttonE);

        thehandler handler = new thehandler();
        button1.addActionListener(handler);
        button2.addActionListener(handler);
        button3.addActionListener(handler); 
        button4.addActionListener(handler);
        button5.addActionListener(handler);
        button6.addActionListener(handler);
        button7.addActionListener(handler);
        button8.addActionListener(handler);
        button9.addActionListener(handler);
        button0.addActionListener(handler);
        buttonR.addActionListener(handler);
        buttonE.addActionListener(handler);

    }

        //building class inside class
        private class thehandler implements ActionListener{

            public void actionPerformed(ActionEvent event){

            if(event.getSource()== button1)
                x.setText("7");
            else if (event.getSource()== button2)
                x.setText("8");
            else if (event.getSource()== button3)
                x.setText("9");
            else if (event.getSource()== button4)
                x.setText("4");
            else if (event.getSource()== button5)
                x.setText("5"); 
            else if (event.getSource()== button6)
                x.setText("6");
            else if (event.getSource()== button7)
                x.setText("1");
            else if (event.getSource()== button8)
                x.setText("2");
            else if (event.getSource()== button9)
                x.setText("3");
            else if (event.getSource()== button0)
                x.setText("0");
            else if (event.getSource()== buttonR)
                x.setText("   ");   
            }
        }

    }
هل كانت مفيدة؟

المحلول

يمكنك إضافة ملف MouseListener إلى حقول النص حتى تعرف متى يتحول المستخدم من X إلى Y والعكس:

private JTextField selected;

selected = x;
    x.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            selected = x;
        }
    });
    y.addMouseListener(new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            selected = y;
        }
    });

للقيام بالطرح ، قم بتحويل النص الموجود في x و y إلى ints وطرحه. يمكنك إعادة تشكيل الخاص بك actionPerformed إلى:

    public void actionPerformed(ActionEvent event) {

        String s = selected.getText();
        if (event.getSource() == buttonR) {
            x.setText("");
            y.setText("");
            z.setText("");
        } else if (event.getSource() == buttonE) {
            int result = Integer.parseInt(x.getText()) - Integer.parseInt(y.getText());
            z.setText(String.valueOf(result));
        } else {
            String command = event.getActionCommand();
            selected.setText(s + command);
        }
    }

نصائح أخرى

يبدو هذا الواجب المنزلي لذلك لن أعطيك التفاصيل ، على أي حال

  1. بدلا من ذلك باستخدام setText يجب عليك أولا getText ثم تسلسل الرقم الحالي بالفعل مع الرقم الجديد
  2. يمكنك استخدام متغير في بداية الخاص بك actionPerformed والتبديل بين اثنين من الحقول النصية مع قيمة منطقية على سبيل المثال. على سبيل المثال. JTextField cur = first ? x : y
  3. فقط اقرأ وثائق Integer أو String دروس وستجد ما تحتاجه (toString, valueOf, parse)

بالمناسبة ، أجبت عليك أيضًا بالأمس واقترحت عليك عدم استخدام سلسلة if/else لكل زر لأنك تعرف ما هو الرقم الذي يتم عرضه .. مثال:

((JButton)e.getSource()).getText() == "1"

هذا يعني أنك تضيع الكثير من خطوط التعليمات البرمجية ..

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top