【问题标题】:Can I use BufferedReader and create an array inside actionListener class?我可以使用 BufferedReader 并在 actionListener 类中创建一个数组吗?
【发布时间】:2011-06-13 18:50:15
【问题描述】:

我创建了一个 actionListener 类。在 actionPerformed 方法中,我想运行一个代码。此代码涉及从多个文本文件导入数据,并将它们存储在二维数组中。然后它将打印出框架中的报价列表。然后它会打印出 5 个分析并让用户选择哪一个。但是,我目前被 IOException 困住了。此外,某些代码状态会给出错误“无法访问的代码”。那是什么意思?下面是我的 actionListener 类的代码

import java.awt.event.*;
import java.io.*;
import java.util.*;

public class CrucibleButtonListener implements ActionListener 
{
  private Swing g;

public CrucibleButtonListener (Swing g)
{
   this.g = g;
}

public void actionPerformed(ActionEvent e)
{
   this.g.updateTextField(getQuotes());
}

private String getQuotes() throws IOException
{
   BufferedReader inputQuote;
   BufferedReader inputTheme;
   BufferedReader inputCharacterAnalysis;
   BufferedReader inputSignificance;
   BufferedReader inputPlotEnhancement;
   BufferedReader inputSpeaker;

   Scanner in = new Scanner (System.in);
   int howMany=0;
   int quoteSelection;
   int analysisSelection;

   // Count how many lines in the text file
   FileReader fr = new FileReader ("CrucibleQuotations.txt");
   LineNumberReader ln = new LineNumberReader (fr);
   while (ln.readLine() != null)
   {
     howMany++;
   }

  //import information from the text file 
  inputQuote = new BufferedReader (new FileReader ("CrucibleQuotations.txt"));
  inputTheme = new BufferedReader (new FileReader("CrucibleTheme.txt"));
  inputCharacterAnalysis = new BufferedReader (new FileReader("CrucibleCharacterAnalysis.txt"));
  inputSignificance = new BufferedReader (new FileReader("CrucibleSignificance.txt"));
  inputPlotEnhancement = new BufferedReader (new FileReader("CruciblePlotEnhancement.txt"));
  inputSpeaker = new BufferedReader (new FileReader("CrucibleSpeaker.txt"));

//Create array based on how many quotes available in the text file
String [][] quotes = new String [howMany][6];

//Store quote information in the array and display the list of quotations
for (int i=0; i<howMany; i++)
{
  quotes [i][0] = inputQuote.readLine();
  return (i+1 + ") " + quotes [i][0]);
  quotes [i][1] = inputTheme.readLine();
  quotes [i][2] = inputCharacterAnalysis.readLine();
  quotes [i][3] = inputSignificance.readLine();
  quotes [i][4] = inputPlotEnhancement.readLine();
  quotes [i][5] = inputSpeaker.readLine();
}

//Ask user to choose the quote they want to analyze
return ("Choose a quotation by inputting the number: ");    
quoteSelection = in.nextInt ();

if (quoteSelection!=0)
{
  //Show user selections to analyze
  return ("1. Theme");
  return ("2. Character Analysis");
  return ("3. Significance");
  return ("4. Plot Enhancement");
  return ("5. Speaker");
  analysisSelection = in.nextInt ();

  //Display the analysis
  if (analysisSelection <= 5 || analysisSelection > 0)
  {
    return (quotes [quoteSelection-1][analysisSelection]);
  }
}
}
}

这里是摇摆班。它只包含一个按钮,我似乎无法使其工作。

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.*;

public class Swing 
{  
  private JLabel label;
  public Swing()
  {    
    JFrame frame = new JFrame ("FRAME SAMPLE");
    frame.setSize(500, 500);
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    JButton cButton = new JButton("The Crucible");//The JButton name.
    frame.add(cButton);//Add the button to the JFrame.
    cButton.addActionListener(new CrucibleButtonListener(this));
  }
}

主类:

public class Main
{
  public static void main (String [] args) 
  {
    new Swing();
  }
}

【问题讨论】:

  • 从第 61 行开始的代码(在 CrucibleButtonListener 类中)将不会被执行,因为您从方法中提早 return。

标签: java swing awt actionlistener


【解决方案1】:

您正试图将一个不基于对象或类的简单线性控制台程序直接转换为事件驱动的 Swing GUI 应用程序,直言不讳,这永远行不通;一个人的逻辑不能硬塞进另一个人的逻辑。您的第一个任务是将您的代码更改为具有一个或多个类的真正的 OOP 程序,并将所有用户交互代码与程序逻辑代码分开。完成此操作后,您将能够更轻松地在 GUI 程序中使用您的代码。

附录:在 try/catch 块中调用 getQuotes

  try {
     String quotes = getQuotes();
     g.updateTextField(quotes);
  } catch (IOException e1) {
     e1.printStackTrace();
     // or perhaps better would be to display a JOptionPane telling the user about the error.
  }

【讨论】:

  • 好的,我想我明白了,我试着按照你告诉我的去做。我现在编辑了 actionListener 类,并包含了 swing 类。不幸的是它仍然不起作用。请帮我编辑。
  • 不,无法编辑它以使其工作,因为您仍在使用相同的静态主代码,并使用与 System.in 绑定的扫描程序。您需要从代码重新开始,而不是借用旧代码来创建 GUI。
  • 所以我应该使用什么来代替扫描仪?旧代码其实是我自己写的。我只想使用相同的功能,但使用 GUI。
  • 您可能想要使用 GUI 的 JTextFields。让用户填写 JTextFields,然后在 JButton 的 ActionListener 中收集信息。
  • 好的,我会尝试修复扫描仪部件。但是,如上所述,我遇到了一个新问题(我对其进行了编辑)。代码似乎无法使用 IOException 运行,因为我使用的是 bufferedreader,所以我需要它。请看一看。
【解决方案2】:

复制和粘贴是程序员能做的最糟糕的事情。

您的变量是方法 main 的本地变量,您无法在其他任何地方访问它们。将它们移出方法。如果将它们设为静态,则可以使用 MainProgram.inputQuote 等访问它们。但是,静态变量通常是一种糟糕的编码风格。

所以你最好把它和代码一起移到一个单独的类(我们现在称之为Worker)中,并且只在MainProgram中执行以下操作

public void main(string[] args) {
    Worker worker = new Worker();
    CrucibleButtonListener l = new CrucibleButtonListener(Worker);
    ...
}

在 CrucibleButtonListener 的构造函数中,你将 worker 分配给一个字段,并且可以随时访问它。

这有点多打字,但会带来良好的风格和灵活性。买一本好书和/或学习一些好的代码。

您可以直接使用 MainProgram 而不是 Worker,但我强烈希望最小化主类。我只让它将其他类绑定在一起。顺便说一句,使用一些有意义的名称而不是“MainProgram”。否则,您将结束调用所有程序,例如
java MainProgram1
java MainProgram2
java MainProgram3

【讨论】:

    【解决方案3】:

    这是一个简单的入门解决方案,以伪代码的形式编译和运行,但不读取任何文件。希望 OOPuritans 会让你使用它。一旦你跨过这个门槛,你就会弄清楚如何使用 JTable,在 JList 中设置 selectionModels,使用 invokeLater 范式等。祝你好运,- M.S.

    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    public class Crucible extends JPanel implements ActionListener {
    
        private JTextField tf = new JTextField();
        private JList list = new JList (new String[] {"Theme", "Character Analysis",
                        "Significance", "Plot Enhancement", "Speaker"});
        private final static String helpfulText = 
                "This is the GUI version of my aplication that analyzes\n" +
                "the quotations received on crucibles and swings. ....",
                    bNames[] = {"Quit", "Run", "Help"};
    
        public Crucible () {
            super (new BorderLayout());
            JPanel bp = new JPanel (new GridLayout (1,bNames.length));
            for (int i = 0 ; i < bNames.length ; i++) {
                JButton b = new JButton (bNames[i]);
                b.addActionListener (this);
                bp.add (b);
            }
            add (new JScrollPane (list), "Center");
            add (bp, "South");
            add (tf, "North");
        }
    
        private String getQuotes () {
            int quoteSelection,
                analysisSelection = list.getSelectedIndex(),
                howMany = getLineCount ("CrucibleQuotations.txt");
    
            if (analysisSelection < 0) {
                JOptionPane.showMessageDialog (null, "Please select type of analysys",
                        "Crucible Quotes", JOptionPane.ERROR_MESSAGE);
                return "";
            }
    
            // Create array based on how many quotes available in the text file
            ListModel lm = list.getModel();
            String[][] quotes = new String [howMany][1+lm.getSize()]; 
            // Buffered Reader ...
            // Populate the array and close the files
            // catch IO, FileNotFound, etc Exceptions to return ""
            // Some dummy data for now:
            for (int i = 0 ; i < howMany ; i++) {
                quotes[i][0] = "Quote [" + i + "]";
                for (int j = 0 ; j < lm.getSize() ; j++)
                    quotes[i][j+1] = "(" + (String) lm.getElementAt (j) + ")";
            }
    
            // Next Step:
            // Display the array with JTable in a JScrollPane,
            // get quoteSelection as the selectedRow of JTable
            // For now, ask for a quote index in a dialog
    
            String qStr = JOptionPane.showInputDialog ("Please select quote index");
            if (qStr == null)
                return "";
            try {
                quoteSelection = Integer.parseInt (qStr) - 1;
                if (quoteSelection < 0 || quoteSelection >= howMany)
                    return "";
                return quotes[quoteSelection][0] + " " +
                        quotes[quoteSelection][analysisSelection];
            } catch (NumberFormatException nfe) { }
            return "";
        }
    
        private int getLineCount (String fileName) {
            int howMany = 0;
            try {
                FileReader fr = new FileReader (fileName);
                LineNumberReader ln = new LineNumberReader (fr);
                while (ln.readLine() != null)    {
                    howMany++;
                }
            } catch (FileNotFoundException fnfe) {  fnfe.printStackTrace();
            } catch (IOException ioex) {        ioex.printStackTrace();
            }
            return howMany;
        }
    
        public void actionPerformed (ActionEvent e) {
            String cmd = e.getActionCommand();
            if (cmd.equals (bNames[0]))     System.exit (0);
            else if (cmd.equals (bNames[1]))    tf.setText (getQuotes());
            else
                JOptionPane.showMessageDialog (null, helpfulText, "Swing Help",
                                JOptionPane.INFORMATION_MESSAGE);
        }
    
        public static void main (String[] args) {
            JFrame cFrame = new JFrame ("Crucible");
            cFrame.add (new Crucible());
            cFrame.pack();
            cFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            cFrame.setVisible (true);
    }}
    

    【讨论】:

      猜你喜欢
      • 2012-05-15
      • 2020-08-10
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2014-08-28
      相关资源
      最近更新 更多