2015-06-20 4 views
0

Я создал программу, в которой я могу вводить данные в JTextField и нажатие кнопки сохранения. Я использую JFileChooser для сохранения данных в файле .txt, где каждый JTextField находится в новой строке. Я также создал кнопку, которая вытаскивает JFileChooser для просмотра этого файла и заполнения его соответствующих ячеек.Импорт текста в JTable не отображается

Я новичок в GUI, код, который я написал, не работает. Я пробовал разные варианты и, похоже, не понял. Может кто-нибудь указать мне в правильном направлении, пожалуйста.

Вход является

john 
Doe 
st. Jude 
100 

Вот код

import javax.swing.*; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.table.DefaultTableModel; 

import java.util.Scanner 
import java.util.Vector; 
import java.awt.event.*; 
import java.awt.*; 
import java.text.DecimalFormat; 
import java.io.*; 

//import javax.swing.filechooser; 
import javax.swing.filechooser.FileFilter; 

public class Charity 
{ 
@SuppressWarnings("deprecation") 
public static void main(String[] args) 
{ 
    JFrame frame = new JFrame("Learning Team Charity Program"); 
    Container cp = frame.getContentPane(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    // Charities 
    final String[] charityArray = {"St.Jude", "CHOC", "Cancer Research", "AIDs Foundation", "Crohns Foundation"}; 
    final JComboBox selector = new JComboBox(charityArray); 
    JPanel first = new JPanel(); 
    first.setLayout(new FlowLayout()); 
    first.add(selector); 

    // User input JLabels and JTextFields 
    JLabel nameLabel = new JLabel("First Name: "); 
    final JTextField name = new JTextField(); 
    JLabel lastLabel = new JLabel("Last Name: "); 
    final JTextField lastname = new JTextField(); 
    JLabel donationAmount = new JLabel("Donation Amount: "); 
    final JTextField donation = new JTextField(); 


    JPanel second = new JPanel(); 
    second.setLayout(new GridLayout(4,2)); 
    second.add(nameLabel); second.add(name); 
    second.add(lastLabel); second.add(lastname); 
    second.add(donationAmount); second.add(donation); 


    // Donate & Exit Buttons 
    JButton donateButton = new JButton("Donate"); 
    JButton saveButton = new JButton("Save"); 
    JButton exitButton = new JButton("Exit"); 
    JButton openButton= new JButton("Open File"); 
    JPanel third = new JPanel(); 
    third.setLayout(new FlowLayout()); 
    third.add(donateButton); 
    third.add(saveButton); 
    third.add(openButton); 
    third.add(exitButton); 

    // JTable display 
    final DefaultTableModel model = new DefaultTableModel(); 
    JTable table = new JTable(model); 
    model.addColumn("First Name"); 
    model.addColumn("Last Name"); 
    model.addColumn("Charity"); 
    model.addColumn("Donation"); 

    table.setShowHorizontalLines(true); 
    table.setRowSelectionAllowed(true); 
    table.setColumnSelectionAllowed(true);  
    JScrollPane scrollPane = JTable.createScrollPaneForTable(table); 

    JPanel fourth = new JPanel(); 
    fourth.setLayout(new BorderLayout()); 
    fourth.add(scrollPane, BorderLayout.CENTER); 

    // Button Events 
    exitButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
      System.exit(1); 
     } 
    }); 

    openButton.addActionListener(new ActionListener() 
    { 
    public void actionPerformed(ActionEvent e){ 
    JFileChooser openChooser = new JFileChooser(); 
    int openStatus = openChooser.showOpenDialog(null); 
    if(openStatus == JFileChooser.APPROVE_OPTION){ 
     try{ 
      File myFile = openChooser.getSelectedFile(); 
      BufferedReader br = new BufferedReader(new FileReader(myFile)); 

      String line;   
     while((line = br.readLine())!= null){ 
          model.addRow(line.split(","));   

        }//end while 
         br.close(); 
       }//end try 

       catch(Exception e2){ 
        JOptionPane.showMessageDialog(null, "Buffer Reader Error"); 
       }//end catch 
      } 
     } 


     private void setValueAt(String line, int row, int col) { 
      // TODO Auto-generated method stub 

     } 

    }); 

    saveButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e){ 
      JFileChooser fileChooser = new JFileChooser(); 
      int status = fileChooser.showSaveDialog(null); 
      if (status == JFileChooser.APPROVE_OPTION) 
      { 
       fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("Text", ".txt", "txt")); 
       //fileChooser.setFileFilter(new FileFilter("txt")); 
       PrintWriter output; 
       try { 
        File file = fileChooser.getSelectedFile(); 
        output = new PrintWriter(file +".txt"); 
        for(int row = 0; row<table.getRowCount(); row++){ 
         for(int col = 0; col<table.getColumnCount();col++){ 
          output.println(table.getValueAt(row, col).toString()); 

         } 
         output.println(); 
        } 

        output.close(); 

       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 

      } 
     } 

}); 
    donateButton.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 

      DecimalFormat df = new DecimalFormat("##,###.00"); 
      try 
      { 

       Object[] rows = new Object[]{name.getText(), lastname.getText(), selector.getSelectedItem(), 
        donation.getText()}; 
        model.addRow(rows); 
        name.setText(""); 
        lastname.setText(""); 
        donation.setText(""); 
      } 
      catch (Exception ex) 
      { 
       JOptionPane.showMessageDialog(null, "Enter a Dollar Amount", "Alert", JOptionPane.ERROR_MESSAGE); 
       return; 
      } 
     } 
    }); 

    // Frame Settings 
    frame.setSize(470,300); 
    //frame.setLocation(300,200); 
    cp.setLayout(new BoxLayout(cp, BoxLayout.Y_AXIS)); 
    cp.add(first); 
    cp.add(second); 
    cp.add(third); 
    cp.add(fourth); 
    frame.setVisible(true); 

    } 
} 
+1

Используйте метод DefaultTableModel и вызывайте его метод 'addRow (...)' для добавления строк. Кроме того, не сравнивайте строки с помощью '==' или '! ='. Используйте вместо этого метод 'equals (...)' или 'equalsIgnoreCase (...)'. Поймите, что '==' проверяет, соответствуют ли две ссылки на объекты *, которые вас не интересуют. Методы, с другой стороны, проверяют, имеют ли две строки одни и те же символы в одном порядке, и это то, что дело здесь. –

+1

Спасибо. Я понимаю, что я должен передать значение в скобках после addRow. Я сделал это в кнопке, которая сохраняет данные в текстовый файл. Я просто не могу понять, что передать, чтобы отобразить данные. – sammyb123

ответ

0

Я понял. Спасибо всем тем, кто пытался помочь.

openButton.addActionListener(new ActionListener() 
    { 
    public void actionPerformed(ActionEvent e){ 
    JFileChooser openChooser = new JFileChooser(); 
    int openStatus = openChooser.showOpenDialog(null); 
    if(openStatus == JFileChooser.APPROVE_OPTION){ 
     try{ 
      File myFile = openChooser.getSelectedFile(); 
      //BufferedReader br = new BufferedReader(new FileReader(myFile)); 
          Scanner br = new Scanner(new FileReader(myFile)); 
      String line;   
     while((line = br.nextLine())!= null){ 
         Object[] myRow = new Object[]{line,br.nextLine(), br.nextLine(), br.nextLine()}; 
          model.addRow(myRow); 
          // line = br.readLine(); 
           if(br.nextLine()== " "){ 
            line=br.nextLine(); 
           } 
        }//end while 
         br.close(); 
       }//end try 

       catch(Exception e2){ 
        return; 
       }//end catch 
      } 
     } 

    }); 
+1

Не очень хорошее решение. Вам не следует просто использовать метод readLine(). Если у вас нет нужного количества строк в файле, вы создадите исключение IOException. Если у вас есть и пустая строка, вы, скорее всего, сгенерируете IOException. Данные строк следует рассматривать как данные строки, что означает, что каждая строка должна быть одной строкой в ​​файле. Затем вы должны использовать разделитель (кроме «») для разделения каждого значения столбца и использования оператора split(), как показано ниже. Вы по-прежнему используете «==» для сравнения строк, хотя первый комментарий сказал вам не делать этого. – camickr

+0

Есть вещи, которые я до сих пор не могу полностью понять. Я всего лишь 3 недели в графическом интерфейсе. Я изменил код в программе, чтобы иметь .equals(). Что касается пустых строк, я отделяю каждый набор введенных данных пустой строкой, и я не получил никаких ошибок. Я помещаю код, чтобы пропустить пустую строку и читать со следующего. – sammyb123

0

Я понимаю, что я должен передать значение в скобках после addRow.

Люди не знают, что это значит, потому что код, который вы разместили здесь, не имеет метода addRow (...).

Я вижу, что вы отправили второй вопрос через 2 часа: https://stackoverflow.com/questions/30951407/how-to-properly-read-a-txt-file-into-a-a-row-of-a-jtable.

Храните все комментарии в одном месте, чтобы люди понимали, что происходит.

Кроме того, размещение нескольких случайных строк кода не помогает нам, потому что мы не знаем контекста использования кода. Например, я понятия не имею, как вы создали переменную «model». Я не знаю, добавили ли вы модель в таблицу.

Опубликовать надлежащее SSCCE при отправке вопроса, поэтому у нас есть необходимая информация. Выбор файла не имеет отношения к проблеме, потому что у нас нет доступа к вашему реальному файлу. Поэтому вместо этого вам нужно отправить жестко закодированные данные. Легкий способ сделать это - использовать StringReader.

Вот рабочий пример, который показывает, как читать/синтаксический анализ/загрузить файл в JTable:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.table.*; 
import java.io.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     try 
     { 
      DefaultTableModel model = new DefaultTableModel(0, 4); 

      String data = "1 2 3 4\na b c d\none two three four"; 
      BufferedReader br = new BufferedReader(new StringReader(data)); 
      String line; 

      while ((line = br.readLine()) != null) 
      { 
       String[] split = line.split(" "); 
       model.addRow(split); 
      } 

      JTable table = new JTable(model); 
      add(new JScrollPane(table)); 
     } 
     catch (IOException e) { System.out.println(e); } 
    } 

    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 
} 

Все, что вам нужно сделать, это изменить код, чтобы использовать FileReader вместо StringReader.

+0

Спасибо. Я сделал некоторые изменения, как вы отметили, но я все равно получаю то же самое. Я обновил код, чтобы иметь все, чтобы вы могли лучше видеть все, что у меня есть. Мне нужно, чтобы они отображались горизонтально в одну строку, все, что они делают сейчас, отображается вертикально в одном столбце. – sammyb123

+0

@ sammyb123, вы не разместили SSCCE (вы отправили все свое приложение, которое не относится к указанному вопросу). Посмотрел ли вы формат вашего входного файла?Как данные в вашем файле отличаются от данных в моем StringReader? Если все ваши элементы отображаются в одном столбце, это, вероятно, потому, что вы сохраняете каждый столбец данных в отдельной строке. Если вы хотите, чтобы все столбцы в одной строке сохранялись в одной строке, это означает, что вам нужно использовать 'print (...)' для первых трех столбцов, а затем 'println (...)' для последнего колонка. – camickr

Смежные вопросы