1

txt ファイルからのすべての本のリストを正しく表示するテーブルがあります。フレームに新しいボタンを追加して、ID番号をテキストフィールドに取得し、見つかった場合はファイルからレコードを削除しますが、テーブルからも削除したい場合は、テーブルフレームを再表示する必要があります。レコードがファイルから削除されたときに、テーブルが自動的に更新され、テーブル フレームを再表示する必要がなくなります。私のコードはこれです:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;

public class ReadBookFileToListM {

public ReadBookFileToListM(){
   final ReadBookFileToList rbftl=new ReadBookFileToList();
   final JFrame Bframe=new JFrame("All Book List");
  final JTextField tf1=new JTextField("             ");
  final JLabel foundlable=new JLabel();
    JButton button1=new JButton("Back To Main Page");
    JButton button2=new JButton("Exit");
    JButton button3=new JButton("Delete Book");
    button1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            Bframe.setVisible(false);
            new MainFrame().setVisible(true);
        }
    });
    button2.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    });


    JTable Btable=new JTable(rbftl);

    button3.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
            boolean find=false;
    String Bookid=tf1.getText();
    File Mf=new File("D:\\AllBookRecords.txt");
    File Tf=new File("D:\\Boutput.txt");
    try{
        FileReader Bfr=new FileReader(Mf);
        BufferedReader Bbr=new BufferedReader(Bfr);
        PrintWriter Bpw=new PrintWriter(new FileWriter(Tf));
        String Bs;
        while( (Bs=Bbr.readLine()) != null ){
                String[] Ust=Bs.split("   ");
                String Bname=Ust[0];
                String Bdate=Ust[1];
                String id=Ust[2];
            if(id.equals(Bookid.trim())){
                find=true;
                foundlable.setText("Book Found,    "+ Bname + "  " + Bdate);
            }
            if(!id.equals(Bookid.trim())){
                Bpw.println(Bs);
            }
        }
        Bpw.close();
        Bbr.close();
        Mf.delete();
        Tf.renameTo(Mf);

    } catch(FileNotFoundException fnfe){
        foundlable.setText("File Not Found");
    } catch(IOException ioe){
        foundlable.setText("IO Error");
        ioe.printStackTrace();
    }
    finally{
        rbftl.fireTableDataChanged();
        if(find)
        foundlable.setText("Book Deleted");
        else
            foundlable.setText("Book Not Found!");
            tf1.setText("     ");
    }
        }
    });

    JPanel panel=new JPanel();
    JScrollPane sp=new JScrollPane(Btable);
    button1.setToolTipText("To Go Main Page, Click here");
    button2.setToolTipText("Terminate Program");
    panel.add(sp);
    panel.add(button1);
    panel.add(button2);
    panel.add(button3);
    panel.add(tf1);
    panel.add(foundlable);
    Bframe.add(panel);
    Btable.setAutoCreateRowSorter(true);
    Bframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Bframe.setBounds(300, 60, 550, 550);
    Bframe.setVisible(true);
}

public static void main(String[] args){
    new ReadBookFileToListM();
}
  }

ありがとうございました。

4

3 に答える 3

6

addNotify() メソッド JTable オブジェクトは、囲んでいるスクロール区画を再構成するため、便利な場合があります。

tableName.addNotify()テーブルの行を削除した後に追加するだけです。

于 2013-01-08T18:32:09.797 に答える
3

どの行を削除するかを決定できる場合は、次を使用できます。

AbstractTableModel#fireTableRowsDeleted

その後、必要に応じて再描画リクエストを発行します。

于 2013-01-08T17:43:17.760 に答える
0

あなたが正しく理解しているなら、テーブルから行を削除したいですか?

その場合は、行を削除しTableModel、適切なテーブル変更イベントを発生させて、行を削除したことをテーブルに知らせる必要があります。

于 2013-01-08T17:44:08.753 に答える