2011-01-22 75 views
1

我已经创建了一个actionListener类。在actionPerformed方法中,我想运行一个代码。此代码涉及从多个文本文件导入数据,并将它们存储在二维数组中。然后它会打印出框架中的引号列表。然后它将打印出5个分析并让用户选择哪一个。但是,我目前坚持IOException。另外,一些代码状态会给出一个错误“无法访问的代码”。这意味着什么?以下是我的actionListener类的代码我可以使用BufferedReader并在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]); 
    } 
} 
} 
} 

这里是swing类。它只包含一个按钮,我似乎无法使它工作。

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(); 
    } 
} 
+0

自从您从方法提前返回后,第61行以后的代码(类`CrucibleButtonListener`)将不会执行。 – ryanprayogo 2011-01-23 00:38:21

回答

1

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

您的变量是main方法的本地变量,您无法在其他任何地方访问它们。将它们移出该方法。如果你使它们成为静态的,那么你可以使用MainProgram.inputQuote等来访问它们。但是,静态变量通常是一种错误的编码风格。

所以你最好还是将它全部移动到一个单独的类(姑且称之为工人现在)与代码放在一起,只有做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

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. 
    } 
+0

好吧,我想我明白了,我试着做你告诉我要做的事情。我现在编辑了actionListener类,并且包含了swing类。不幸的是它仍然无法正常工作。请帮我编辑。 – Mike 2011-01-22 21:52:17

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); 
}} 
相关问题