我做的界面里,每操作一次会打开一个TabbedPane(选项卡)
选项卡中添加的组件是一个滚动条和一个表格
我想在选中某个选项卡时,就可以把选项卡表格中的数据保存在一个txt文件里
就像现在的浏览器那样,打开多个选项卡,可以保存选中的选项卡里的内容现在问题就是1、怎么获得选项卡的标题并能显示在“保存对话框”中“文件名”文本框里
            2、怎么得到选项卡中表格的数据哪位达人做过这方面的例子或有这方面的例子,教一下我

解决方案 »

  1.   

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.File;import javax.swing.JButton;
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTabbedPane;public class Jtest2 extends JFrame implements ActionListener {  private static final long serialVersionUID = -2517228676216833821L;
      JFileChooser fileChooser;
      JTabbedPane paneTab;  public Jtest2() {
        super("Jtest2");    this.setSize(640, 480); // 设置窗口大小
        this.setLocationRelativeTo(null); // 窗口屏幕居中
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 窗口关闭,则程序退出
        java.awt.Container container = this.getContentPane();
        
        JButton button1 = new JButton("保存文件");
        button1.setActionCommand("保存文件");
        button1.addActionListener(this);
        fileChooser = new JFileChooser();
        paneTab = new JTabbedPane();
        JPanel paneBlank = new JPanel();
        paneTab.addTab("标题", paneBlank);
        
        container.add(button1, BorderLayout.PAGE_START);
        container.add(paneTab, BorderLayout.CENTER);
      }
      public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("保存文件")) {
          // 下面的路径可以自由设置,不需要是 c:\
          // 下面代码可以获取当前标签的标题,并显示在文件对话框上
          String strFile = "c:\\" + paneTab.getTitleAt(paneTab.getSelectedIndex()) + ".txt";
          File file = new File(strFile);
          fileChooser.setSelectedFile(file);
          int fresult = fileChooser.showSaveDialog(this);
          if (fresult == JFileChooser.APPROVE_OPTION) {
            // 自己的代码
          }
        }
      }
      
      // 创建GUI
      private static void createAndShowGUI() {
        Jtest2 xframe = new Jtest2();
        xframe.setVisible(true);
      }  public static void main(String[] args) {
        // 为事件处理线程安排一个任务:创建并显示程序的GUI
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            createAndShowGUI();
          }
        });
      }}
      

  2.   

    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    import java.awt.Dimension;
    import java.awt.GridLayout;public class TableDemo extends JPanel {
        private boolean DEBUG = false; // 是否是调试,如果是则在控制台打印相关信息    public TableDemo() {
            super(new GridLayout(1,0));        // 用 MyTableModel 创建表格,其定义在后面
            JTable table = new JTable(new MyTableModel());
            table.setPreferredScrollableViewportSize(new Dimension(500, 70));        // 创建滚动条,并将表格放在里面
            JScrollPane scrollPane = new JScrollPane(table);        // 将滚动条(包含表格)加入主 Panel
            add(scrollPane);
        }    // 关键类,继承自 AbstractTableModel
        class MyTableModel extends AbstractTableModel {
            // 表格的标题
            private String[] columnNames = {"First Name",
                                            "Last Name",
                                            "Sport",
                                            "# of Years",
                                            "Vegetarian"};
            // 表格的内容
            private Object[][] data = {
                {"Mary", "Campione",
                 "Snowboarding", new Integer(5), new Boolean(false)},
                {"Alison", "Huml",
                 "Rowing", new Integer(3), new Boolean(true)},
                {"Kathy", "Walrath",
                 "Knitting", new Integer(2), new Boolean(false)},
                {"Sharon", "Zakhour",
                 "Speed reading", new Integer(20), new Boolean(true)},
                {"Philip", "Milne",
                 "Pool", new Integer(10), new Boolean(false)}
            };        // 获取列数
            public int getColumnCount() {
                return columnNames.length;
            }        // 获取内容长度
            public int getRowCount() {
                return data.length;
            }        // 获取列名
            public String getColumnName(int col) {
                return columnNames[col];
            }        // 获取单元格数据
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }        /*
             * 获取列编辑器类名
             */
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }        /*
             * 如果表格不可编辑,则不需要实现此方法
             */
            public boolean isCellEditable(int row, int col) {
                //Note that the data/cell address is constant,
                //no matter where the cell appears onscreen.
                if (col < 2) { //如果列数大于2,则不可编辑,可自由定义
                    return false;
                } else {
                    return true;
                }
            }        /*
             * 如果表格数据不能改变,则不需要实现此方法
             */
            public void setValueAt(Object value, int row, int col) {
                if (DEBUG) {
                    System.out.println("Setting value at " + row + "," + col
                                       + " to " + value
                                       + " (an instance of "
                                       + value.getClass() + ")");
                }            data[row][col] = value;
                fireTableCellUpdated(row, col);            if (DEBUG) {
                    System.out.println("New value of data:");
                    printDebugData();
                }
            }        // 打印所有数据
            private void printDebugData() {
                int numRows = getRowCount();
                int numCols = getColumnCount();            for (int i=0; i < numRows; i++) {
                    System.out.print("    row " + i + ":");
                    for (int j=0; j < numCols; j++) {
                        System.out.print("  " + data[i][j]);
                    }
                    System.out.println();
                }
                System.out.println("--------------------------");
            }
        }    /**
         * 创建GUI
         */
        private static void createAndShowGUI() {        // 创建一个窗口
            JFrame frame = new JFrame("TableDemo");
            // 窗口关闭则程序退出
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        TableDemo newContentPane = new TableDemo();
            newContentPane.setOpaque(true);
            frame.setContentPane(newContentPane);        frame.pack();
            frame.setVisible(true);
        }    public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
      

  3.   

    1. 通过 paneTab.getSelectedIndex() 就知道哪个选项卡被选中了
    2. 你把 table 往 paneTab 里加的时候,就知道哪个 table 被加到哪个选项卡里了
    3. 知道了哪个选项卡被选中了,不就知道该保存哪个 table 里的内容了吗
      

  4.   

    table 都是由一个对象生成的,只是TableModel不一样
    然后把table加在一个ScrollPane,再把ScrollPane加在Tab里。我是真的不不知道怎么做下面的, oracle_lover 能不能具体说下呢
      

  5.   

    /*
     * 下面代码未经调试,可能存在一些错误,大体意思明白就行了
     */import ; // 略public class Jtest2 extends JFrame implements ActionListener {  private static final long serialVersionUID = -2517228676216833821L;
      
      // 需要在主类各方法中都要调用的变量在此声明
      private static final int MAXTAB = 10; // 可以允许的最大标签数
      JTable[] tableArray = new JTable[MAXTAB]; // 表格数组
      MyTableModel[] modelArray = new MyTableModel[MAXTAB]; // 表格模型数组
      int tabCount = 0; // 已有的标签和表格计数
      JFileChooser fileChooser;
      JTabbedPane paneTab;  public Jtest2() { // 窗口的构造函数
        super("Jtest2");
        // 在此创建的 paneTab,fileChooser 其他方法均可调用,因为是在外面声明的
        paneTab = new JTabbedPane();
        fileChooser = new JFileChooser();
        ....
      }  public addTabTable() { // 新建表格和标签
        if ((tabCount + 1) >= MAXTAB) return; // tabCount可以允许 0~9
        // 在此创建的 table, model 其他方法均可调用,因为是在外面声明的
        modelArray[tabCount] = new MyTableModel();
        tableArray[tabCount] = new JTable(modelArray[tabCount]);
        ...
        // sp 的作用域为此方法内,下一次又指向新的 JScrollPane
        // 别的方法均不需要操作 sp,因此在某个方法内声明
        JScrollPane sp = new JScrollPane(tableArray[tabCount]);
        paneTab.addTab("标签" + tabCount, sp);
        tabCount++; // 计数器 + 1
      }  public saveData() {
        // 获取当前标签的序号,也是表格数组的序号
        int index = paneTab.getSelectedIndex();
        // 用 modelArray[index] 操作表格 tableArray[index] 进行数据的保存
        ....
        // 根据当前标签设置文件名
        String strFile = "c:\\" + paneTab.getTitleAt(paneTab.getSelectedIndex()) + ".txt";
        File file = new File(strFile);
        fileChooser.setSelectedFile(file);
        int fresult = fileChooser.showSaveDialog(this);
        if (fresult == JFileChooser.APPROVE_OPTION) {
           // 自己的代码
        } 
      }  public void actionPerformed(ActionEvent event) {
        if (event.getActionCommand().equals("保存文件")) {
          saveData();
          // .....
        }
      }   // 关键类,继承自 AbstractTableModel
      class MyTableModel extends AbstractTableModel {
     
      ....}