جافا ثابت مقابل غير ساكنة باستخدام معالجات الحدث
-
11-09-2019 - |
سؤال
أحاول أن أتعلم عن معالجات أحداث Java والاستمرار في الحصول على أخطاء بنوع النوع (ثابت / غير ثابت). بعض الكود أحاول الكتابة تبدو وكأنها:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Main extends JFrame implements ActionListener{
static private int[] intArray = new int[10000];
static private int numOfInts = 0;
static private int avg = 0;
public static void main(String[] args) {
//create main frame
JFrame frame = new JFrame();
frame.setTitle("Section V, question 2");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(350, 250);
frame.setLayout(new GridLayout(4, 1));
frame.setVisible(true);
//create instruction label and add to frame
Label instructions = new Label("Follow the instructions on the exam to use this program");
frame.add(instructions);
//create textfield for index entry and add to frame
JTextField indexEntry = new JTextField();
frame.add(indexEntry);
//create button for average and add to frame
JButton avgBtn = new JButton("Click for Average");
frame.add(avgBtn);
avgBtn.addActionListener(avgBtn);
//create panel to display results and add to frame
JPanel resultsPanel = new JPanel();
resultsPanel.setBackground(Color.BLUE);
frame.add(resultsPanel);
//read in from file
readFromFile();
//compute average
computeAverage();
System.out.println(avg);
}
static private void readFromFile(){
try{
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("numbers.dat");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
int i = 0;
while ((strLine = br.readLine()) != null) {
// Print the content on the console
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());
}
}
static private void computeAverage(){
int sum = 0;
for(int i = 0; i < numOfInts; i++)
sum += intArray[i];
avg = sum/numOfInts;
//return avg;
}
public void actionPerformed(ActionEvent e){
if(e.getSource() == avgBtn){
computeAverage();
}
}
}
من المفترض أن يقوم بإعداد قراءة واجهة المستخدم الرسومية في بعض Ints من ملف ثم حساب متوسطها عند الضغط على زر. ومع ذلك، فإنني أظل مشاكل مع الأشياء الثابتة / غير الثابتة وأعمل الأحداث. خطأي الحالي هي:
main.java:35: addactractener (java.awt.event.actionlistener) في javax.swing.abstractbutton لا يمكن تطبيقها على (javax.swing.jbutton)
Avgbtn.addactionListener (AVGBTN)؛
Main.java:91: لا يمكن العثور على رمز
رمز: متغير AVGBTN
الموقع: الطبقة الرئيسية
إذا (e.getsource () == AvgBTN) {
أفهم أن المحول البرمجي لا يمكنه العثور على AVGBTN لأنه محدد داخل وظيفة أخرى (الرئيسية ())، ولكن هل يمكن لأي شخص أن يلقي بعض الضوء على كيفية إرفاق معالج حدث إليه؟ حاول "هذا" دون جدوى أيضا ... شكرا مقدما، وإذا كنت ترى أي شيء آخر خطأ أحب أن أسمع كيف يمكنني تحقيقه بشكل أفضل.
المحلول
الكود الخاص بك هو فوضوي بعض الشيء، سيكون هناك أخطاء بناء على بناء الجملة إذا تم تجميعها. يجب عدم خلط مكونات التأرجح / AWT، على سبيل المثال: بدلا من استخدام تسمية استخدم Jlabel في Swing، لاستخدام اللوحة JPanel.
يحيط علما بادئة "J" للتأرجح، يجب أن تكون تقرأ كتبا ربما إذا كنت تريد معرفة المزيد عن Java (Swing) أو حتى اقرأ بعض البرامج التعليمية الأساسية.
لا تستخدم الطرق الثابتة إلا إذا كنت تفهم غرضها.
Anyhow هنا هو أقرب مدونة لما تريد:
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;
//constructor - construct the components here and do the initializations
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));
//this.setVisible(true);
//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();
System.out.println(avg);
}
private void readFromFile() {
try {
// Open the file that is the first
// command line parameter
FileInputStream fstream = new FileInputStream("numbers.dat");
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
//Read File Line By Line
int i = 0;
while ((strLine = br.readLine()) != null) {
// Print the content on the console
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());
}
}
private void computeAverage() {
int sum = 0;
for (int i = 0; i < numOfInts; i++)
sum += intArray[i];
avg = sum/numOfInts;
//return avg;
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == avgBtn) {
computeAverage();
}
}
public static void main(String[] args) {
Main m = new Main();
m.setVisible(true);
}
}