我可以使用BufferedReader并在actionListener类中创建一个数组吗?

时间:2011-01-22 19:05:37

标签: java swing awt actionlistener

我已经创建了一个actionListener类。在actionPerformed方法中,我想运行一个代码。此代码涉及从多个文本文件导入数据,并将它们存储在2D数组中。然后它将打印出框架中的引号列表。然后它将打印出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();
  }
}

3 个答案:

答案 0 :(得分:2)

您正在尝试将不基于对象或类的简单线性控制台程序直接转换为事件驱动的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.
  }

答案 1 :(得分:1)

复制&amp;粘贴是程序员可以做的最糟糕的事情。

您的变量是方法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

答案 2 :(得分:0)

这是一个简单的入门解决方案,以编码和运行的伪代码的形式,但不读取任何文件。希望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);
}}