Могу ли я использовать BufferedReader и создать массив внутри класса actionListener? - PullRequest
1 голос
/ 22 января 2011

Я создал класс 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();
  }
}

Ответы [ 3 ]

2 голосов
/ 23 января 2011

Вы пытаетесь напрямую преобразовать упрощенную линейную консольную программу, которая не основана на объектах или классах, в приложение Swing GUI, управляемое событиями, и, если говорить прямо, это никогда не сработает;логика одного не может быть включена в логику другого.Ваша первая задача будет состоять в том, чтобы превратить ваш код в настоящую программу ООП с одним или несколькими классами и отделить весь код взаимодействия с пользователем от кода логики программы.После того, как вы это сделаете, вы гораздо легче сможете использовать свой код в программе с графическим интерфейсом.

addendum: вызов getQuotes в блоке try / catch

  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 голос
/ 22 января 2011

Копирование и вставка - единственное, что может сделать программист.

Ваши переменные являются локальными для метода 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

0 голосов
/ 24 января 2011

Вот простое решение для начала, в форме псевдокода, который компилируется и запускается, но не читает ни один файл. Надеюсь, что OOPuritans позволит вам использовать это. Перейдя этот порог, вы поймете, как использовать JTable, установить selectionModels в JList, использовать парадигму 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);
}}
...