سؤال

أنا أبحث عن الوصف الأساسي لكيفية رسم النص داخل JPanel.أعلم أن هناك مليار برنامج تعليمي ولكن لا أحد منهم ينقر معي ولدي بعض الأسئلة المحددة التي قد تساعد الآخرين الذين يشعرون بالارتباك.كإعداد (تطبيق اختبار) لدي فئة واحدة تحتوي على JLabel وJTextField وJButton وJPanel.يقرأ التطبيق ints من ملف خارجي ويجب أن يعرض متوسطه في اللوحة عند الضغط على JButton.لقد قمت بفرز جميع البرامج الأساسية (أي أن الزر يستجيب ويطبع المتوسط ​​إلى سطر الأوامر) ولكن يبدو أنني لا أستطيع تحديد كيفية طباعة المتوسط ​​على اللوحة.أعتقد أن سؤالي الأكبر هو كيفية دمج طريقة الطلاء () أو طريقة الطلاء () مع بقية التعليمات البرمجية.هل يجب أن يكون فصله الخاص؟هل يجب أن يكون JPanel فئته الخاصة؟يبدو أن هذا ما تخبرني به معظم البرامج التعليمية، لكنني لست متأكدًا من الخطوة الأولى بالضبط.يبدو الرمز كما يلي:

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

public class Main extends JFrame implements ActionListener {
  private int[] intArray = new int[10000];
  private int numOfInts = 0;
  private int avg = 0;

  protected JButton avgBtn;
  protected JTextField indexEntry;
  protected JLabel instructions;
  protected JPanel resultsPanel;

  public Main(){

    //create main frame
    this.setTitle("Section V, question 2");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(350, 250);
    this.setLayout(new GridLayout(4, 1));

    //create instruction label and add to frame
    instructions = new JLabel("Follow the instructions on the exam to use this program");
    this.add(instructions);

    //create textfield for index entry and add to frame
    indexEntry = new JTextField();
    this.add(indexEntry);

    //create button for average and add to frame
    avgBtn = new JButton("Click for Average");
    this.add(avgBtn);
    avgBtn.addActionListener(this);

    //create panel to display results and add to frame
    resultsPanel = new JPanel();
    resultsPanel.setBackground(Color.BLUE);
    this.add(resultsPanel);

    //read in from file
    readFromFile();

    //compute average
    computeAverage();
  }

  private void readFromFile() {
    try {
            // Open the file
            FileInputStream fstream = new FileInputStream("numbers.dat");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));

            //create placeholder for read in ints
            String strLine;

            //Read File Line By Line
            int i = 0;
            while ((strLine = br.readLine()) != null) {
              //place ints in array and increament the count of ints
              System.out.println (strLine);
              intArray[i] = Integer.parseInt(strLine);
              numOfInts++;
              i++;
            }
            //Close the input stream
            in.close();
            System.out.println ("numOfInts = " + numOfInts);
    }
    catch (Exception e) {
            //Catch exception if any
            System.err.println("Error: " + e.getMessage());
    }
  }

  //compute averaage
  private void computeAverage() {
    int sum = 0;
    for (int i = 0; i < numOfInts; i++)
    sum += intArray[i];
    avg = sum/numOfInts;
    System.out.println("avg = " + avg);
  }

//event handling
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == avgBtn) {
            computeAverage();
    }
}

//"main" function
public static void main(String[] args) {
    Main m = new Main();
    m.setVisible(true);
}

//paint
public void paintComponent(Graphics g){
  g.drawString(avg, 75, 75);
}
}

هو موضع تقدير أي وجميع المساعدة / التوجيه.أعلم أنني استخدمت هذا الرمز مؤخرًا لأسئلة أخرى، أريد فقط أن أعرف كل شيء!من الناحية المثالية، ستعرض اللوحة متوسط ​​القراءة بوحدات int عند النقر فوق الزر، وتعرض كل ما تم إدخاله في حقل النص عندما يكون التركيز عليه ويتم الضغط على مفتاح الإدخال، لكنني أتخذ خطوات صغيرة، وكما قلت، أود أن يكون هذا الموضوع بمثابة برنامج تعليمي عام للآخرين الذين لديهم أسئلة مماثلة والذين لا يجدون إجابات من مستندات الشمس أو المواقع الأخرى.شكرا جزيلا مقدما.دان :)

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

المحلول

قم بإنشاء فئة داخلية تعمل على توسيع JPanel داخل فئتك الرئيسية:

class MyPanel extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawString(Integer.toString(avg), 75, 75);
    }

}

فأنت بحاجة إلى استدعاء إعادة الرسم على تلك اللوحة بعد استدعاء computeAverage() أثناء الإجراء:

//event handling
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == avgBtn) {
        computeAverage();
        panel.repaint();
    }
}

نصائح أخرى

أضف JLabel إلى JPanel.

اتصل بـ setText(String) على JLabel وسيتم رسم النص الخاص بك داخل JPanel.

1) لا يحتوي JFrame على طريقة PaintComponent() لذا فإن الكود الذي نشرته لن يفعل أي شيء.تحتاج إلى إنشاء لوحة JPanel مخصصة وتجاوز طريقة PaintComponent() الخاصة بها للقيام بالرسم المخصص.

2) حتى إذا قمت بما ورد أعلاه، فلن يتم عرض اللوحة لأن حجم اللوحة افتراضيًا هو صفر.لذلك ستحتاج بعد ذلك إلى ضبط الحجم المفضل للوحة للتأكد من أنها مرئية.

3) لماذا تفعل هذا حتى.كل ما عليك فعله هو استخدام JLabel وتعيين نص JLabel.

أجد أنه من الصعب أن أصدق أنك نظرت إلى البرامج التعليمية الأخرى.تم تشغيل البرنامج التعليمي Swing اللوحة المخصصة يحتوي على برنامج مكون من 20 سطرًا يوضح الأساسيات.

أعتقد أنك لا ينبغي أن تكون فئة فرعية JFrame.قم بإنشاء مثيل لـ JFrame مثيلًا
متغير الفئة الرئيسية وإضافة JPanel وما إلى ذلك.إليها.

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