2014-10-13 3 views
0

Я делаю ui, в котором я читаю данные из текстового файла в JTable, пользователь может редактировать в JTable, а затем сохранять данные в другой текстовый файл. Мне нужна кнопка обновления, чтобы, если пользователь редактирует JTable и не хочет, чтобы изменения были сделаны, можно нажать кнопку обновления, а данные будут предыдущими данными, считываемыми из текстового файла.Кнопка обновления в Jtable

Вот код:

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

public class Bb extends JFrame 
{ 
private JTable table; 
private DefaultTableModel model; 

@SuppressWarnings("unchecked") 
public Bb() 
{ 

     String aLine ; 
     Vector columnNames = new Vector(); 
     Vector data = new Vector(); 

     try 
     { 
      FileInputStream fin = new FileInputStream("test1.txt"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 


      StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); 

      while(st1.hasMoreTokens()) 
      { 
       columnNames.addElement(st1.nextToken()); 
      } 


      while ((aLine = br.readLine()) != null) 
      { 
       StringTokenizer st2 = new StringTokenizer(aLine, " "); 
       Vector row = new Vector(); 

       while(st2.hasMoreTokens()) 
       { 
        row.addElement(st2.nextToken()); 
       } 
       data.addElement(row); 
      } 
      br.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     final JTable table = new JTable(new DefaultTableModel(data, columnNames){ 
     private static final long serialVersionUID = 1L; 

    @Override 
    public Class getColumnClass(int column) { 
     return Integer.class; 
     } 
    }); 


    JScrollPane scrollPane = new JScrollPane(table); 
     getContentPane().add(scrollPane); 


     JPanel buttonPanel = new JPanel(); 
     getContentPane().add(buttonPanel, BorderLayout.SOUTH); 


     JButton button1 = new JButton("Save"); 
     buttonPanel.add(button1); 
     button1.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       if (table.isEditing()) 
       { 
        int row = table.getEditingRow(); 
        int col = table.getEditingColumn(); 
        table.getCellEditor(row, col).stopCellEditing(); 
       } 

       int rows = table.getRowCount(); 
       int columns = table.getColumnCount(); 



    try { 
     StringBuilder con = new StringBuilder(); 
     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < columns; j++) 
      { 
       Object Value = table.getValueAt (i, j); 
       con.append(" "); 
       con.append(Value); 
      } 
      con.append("\r\n"); 
     } 

    FileWriter fileWriter = new FileWriter(new File("new.txt")); 

    fileWriter.write(con.toString()); 
    fileWriter.flush(); 

    } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
    }); 

     JButton button3 = new JButton("Refresh"); 
     buttonPanel.add(button3); 
     button3.addActionListener(new ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 

      } 
     }); 
    } 

public static void main(String[] args) 
{ 
     Bb Re = new Bb(); 
     Re.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     Re.pack(); 
     Re.setVisible(true); 
} 
} 

текст файла:

a b c d e f e 
78 12 12 45 45 45 78 
45 45 69 56 78 56 23 
45 89 76 42 15 36 23 
+2

вы можете сохранить их в переменных перед редактированием пользователя или снова прочитать текстовый файл –

+0

Довольно многое, что сказал @getlost, но кроме этого я действительно не вижу здесь вопроса. Голосование закрывается как «неясное». –

ответ

0

Попробуйте это:

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 

import javax.swing.*; 
import javax.swing.table.*; 

public class Bb extends JFrame { 
private JTable table; 
private DefaultTableModel model; 
Vector columnNames = new Vector(); 
Vector data = new Vector(); 

@SuppressWarnings("unchecked") 
public Bb() { 

    String aLine; 

    try { 
     FileInputStream fin = new FileInputStream("test1.txt"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fin)); 

     StringTokenizer st1 = new StringTokenizer(br.readLine(), " "); 

     while (st1.hasMoreTokens()) { 
      columnNames.addElement(st1.nextToken()); 
     } 

     while ((aLine = br.readLine()) != null) { 
      StringTokenizer st2 = new StringTokenizer(aLine, " "); 
      Vector row = new Vector(); 
      while (st2.hasMoreTokens()) { 
       row.addElement(st2.nextToken()); 
      } 
      data.addElement(row); 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    table = new JTable(new DefaultTableModel(getDefaultData(), columnNames) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Class getColumnClass(int column) { 
      return Integer.class; 
     } 
    }); 

    JScrollPane scrollPane = new JScrollPane(table); 
    getContentPane().add(scrollPane); 

    JPanel buttonPanel = new JPanel(); 
    getContentPane().add(buttonPanel, BorderLayout.SOUTH); 

    JButton button1 = new JButton("Save"); 
    buttonPanel.add(button1); 
    button1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      if (table.isEditing()) { 
       int row = table.getEditingRow(); 
       int col = table.getEditingColumn(); 
       table.getCellEditor(row, col).stopCellEditing(); 
      } 

      int rows = table.getRowCount(); 
      int columns = table.getColumnCount(); 

      try { 
       StringBuilder con = new StringBuilder(); 
       for (int i = 0; i < rows; i++) { 
        for (int j = 0; j < columns; j++) { 
         Object Value = table.getValueAt(i, j); 
         con.append(" "); 
         con.append(Value); 
        } 
        con.append("\r\n"); 
       } 

       FileWriter fileWriter = new FileWriter(new File("new.txt")); 

       fileWriter.write(con.toString()); 
       fileWriter.flush(); 

      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
     } 
    }); 

    JButton button3 = new JButton("Refresh"); 
    buttonPanel.add(button3); 
    button3.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      refresh(); 
     } 
    }); 
} 

public static void main(String[] args) { 
    Bb Re = new Bb(); 
    Re.setDefaultCloseOperation(EXIT_ON_CLOSE); 
    Re.pack(); 
    Re.setVisible(true); 
} 

private void refresh() { 

    DefaultTableModel dtm = new DefaultTableModel(getDefaultData(), 
      columnNames) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Class getColumnClass(int column) { 
      return Integer.class; 
     } 
    }; 
    table.setModel(dtm); 
    table.revalidate(); 
} 

private Vector getDefaultData() { 
    Vector defData = new Vector(); 
    for (int i = 0; i < data.size(); i++) { 
     Vector tmp = (Vector) data.get(i); 
     Vector nVc = new Vector(); 
     for (int j = 0; j < tmp.size(); j++) { 
      nVc.addElement(tmp.get(j)); 
     } 
     defData.add(nVc); 
    } 
    return defData; 
} 

} 

Это будет работать, но это не хорошая практика, вы должны запустить код который связан с интерфейсом на EDT и другой части (чтение файла, создание вектора) на другой поток.

+0

Я пробовал приведенный выше код, но не смог найти решение –

+0

@Rudy dev Я отредактировал свой ответ, теперь он должен работать. – Titus

+0

Спасибо большое @Titus это работает. –

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