1

我创建了一个 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();
  }
}
4

3 回答 3

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.
  }
于 2011-01-22T21:09:02.933 回答
1

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

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

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

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

在 CrucibleButtonListener 的构造函数中,您将工作人员分配给一个字段,并且可以随时访问它。

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

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

于 2011-01-22T20:10:21.703 回答
0

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

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);
}}
于 2011-01-24T00:05:20.537 回答