jFrame上有一个jTable,一个jTextArea和一个jButton。我想当选择jTable的任意一行时,在jTextArea中输入一些内容,点击jButton时能将内容与行一一对应~
现在做法是jButton加ActionListener,先判断jTable取的rowIndex,在将此行的所有内容输入到一个Vector中,再在Vector最后add进去从jTextArea处得来的内容,这样能把两者内容对应起来。问题是:我在视图上要怎么实现,例如我先选择jTable的第一行,然后在jTextArea中输入“a”,点击按钮后存入到Vector a中,接着如果再选择jTable的第二行,此时的jTextArea中还有“a”,怎么把这个“a”去掉(加个MouseListener应该可以实现吧),如果去掉了,再选择jTable的第一行,怎么又把“a”重新显示在jTextArea上,说得有点乱,不知道大家听的明白不?已经郁闷死了,我都想过按按钮时新建一张数据库的表,将这张表扔进去,鼠标变化时,直接去那张表里取值~~~

解决方案 »

  1.   

    在jtable行上增加监听器,每当选择一行,读出该行的内容,然后把该内容设为jtextarea的内容,当点击jbutton后,把jtextarea的内容替换掉所选择的行的内容,同时把jtextarea的内容设为空串。
      

  2.   

    明白,虽然你说的确实很乱。
    从你说的这么乱,我可以推断,你的思路现在也很乱。那么,你的思路已经接近正确做法了,为何不冷静下来再仔细地分析一下呢~~毛主席教导我们说,胜利往往来自坚持中的再一次努力~~而且实现这个效果的方法不唯一。你如果认为这种方式比较乱可以另外开辟一个空间存储这个对应关系。具体的方式你自己选择。但是,我还是建议,即使你采用你所描述的那种方式,不要用什么每次往后面add。一开始的时候一次都add一个空串,然后每次找到去set。不然的话你处理起来会有麻烦。而且以后出错可能你自己都不知道是怎么出来的。
      

  3.   


    将该行的什么内容设为jTextArea的内容啊,不是很明白~我再举个例子描述。比如现在有2行3列的表格,第一行是1,2,3;第二行是4,5,6。选中第一行时在jTextArea处输入a(jTextArea初始是空的),点击按钮(保存),再选中第二行,在jTextArea处输入b(此时jTextArea处应该也是空的),再点击按钮,接下来选中第一行处就能在jTextArea处显示a,选中第二行处就能在jTextArea处显示b。我是用DefaultTableModel(Vector row,Vector col)建表格的,现在的想法是建表时将行向量(row)复制一个(row2),只是row2多加一位放jTextArea的值,在对表格进行增加或删除等操作时同时对row2也进行同样的操作,在jButton处加监听,将选中行对应的jTextArea处内容放到row2的最后1位,再在jTable处加MouseListener,取得选中行的索引,将row2在此索引处的最后一位取出赋到jTextArea上,不知道这样行不行?另外,对于row2内部向量的内部元素要怎么访问啊?这里的row2应该是这个值,row2 = 【【1,2,3,null】,【4,5,6,null】】,我想对它的第一个【1,2,3,null】里的null处访问要怎么写?
      

  4.   


    呵呵,大大每天都在啊,我现在是一天一道jTable题,我感觉jTable是GUI里面最烦的了,光model就分了好几种,view和model又是分开的,烦死了,有没有专门关于jTable比较好的书介绍~~没书光自己摸索经常碰到问题~
      

  5.   

    啥也不说了,跟你动真格得算了~~嗯?怎么又是你哦~~还用DefaultTableModel(Vector row,Vector col)这个呢,恩,上次你说不太了解怎么改写那些方法是吧?这次看看。如果你坚持使用DefaultTableModel(Vector row,Vector col),那么,我们还有其他招数。你试试看。这个方法是按照你所说的那种方式进行的。不行包换~~
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.List;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.table.DefaultTableModel;public class TableTest extends JFrame { private static final long serialVersionUID = 1L;
    private List<List<Object>> data = new ArrayList<List<Object>>();
    private static final String[] COLUMN_NAMES = { "aa", "bb", "cc", "dd" };
    private JTextArea area = new JTextArea(4, 10); public TableTest() {
    super();
    initData();
    Container c = getContentPane(); DefaultTableModel dataModel = new DefaultTableModel() {
    private static final long serialVersionUID = 1L; @Override
    public int getColumnCount() {
    return COLUMN_NAMES.length;
    } @Override
    public int getRowCount() {
    return data.size();
    } @Override
    public String getColumnName(int column) {
    return COLUMN_NAMES[column];
    } @Override
    public Object getValueAt(int row, int column) {
    Object value = data.get(row).get(column);
    return value == null ? "" : value.toString();
    } @Override
    public void setValueAt(Object value, int row, int column) {
    if (row < data.size() && column < COLUMN_NAMES.length) {
    data.get(row).set(column,
    value == null ? "" : value.toString()); fireTableDataChanged();
    }
    } @Override
    public boolean isCellEditable(int row, int column) {
    return false;
    }
    };
    final JTable table = new JTable(dataModel) {
    private static final long serialVersionUID = 1L; @Override
    public void valueChanged(ListSelectionEvent e) {
    int row = getSelectedRow();
    if (row >= 0) {
    Object obj = dataModel.getValueAt(row, COLUMN_NAMES.length);
    area.setText(obj == null ? "" : obj.toString());
    area.requestFocus();
    area.selectAll();
    }
    super.valueChanged(e);
    }
    };
    c.setLayout(new BorderLayout());
    c.add(new JScrollPane(table));
    JButton okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow();
    if (row >= 0) {
    data.get(row).set(COLUMN_NAMES.length,
    area.getText().trim());
    } }
    });
    c.add(okButton, BorderLayout.SOUTH);
    c.add(new JScrollPane(area), BorderLayout.EAST); setSize(600, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    } private void initData() {
    for (int i = 0; i < 20; i++) {
    List<Object> record = new ArrayList<Object>();
    record.add(String.valueOf(i + 1));
    record.add("aa");
    record.add("bb");
    record.add("cc");
    record.add("");
    data.add(record);
    }
    } public static void main(String args[]) {
    new TableTest();
    }
    }
      

  6.   

    恩,果然强悍~~不过能用Vector么?看来我刚那个想法是可以的,只是太废了点,只想着建两个Vector了,你这个是直接在data后加一位~
    主要是一直没有改写DefaultTableModel里的方法,老是直接用DefaultTableModel datamodel = new DefaultTableModel(row,col),这样如果在原row上改,建表会出错~~valueChanged(ListSelectionEvent e)一般是用来监听什么的?还有,上次问的value == null ? "" : value.toString());什么意思?
    是不是说如果value不为null,则把它转成string型。我只是感觉从数据库里读的话好像都是用Vector,我就用Vector了,我先去学ArrayList了,表里有jComboBox和jCheckBox用ArrayList也能建吧?
      

  7.   


    jTable是GUI里面最烦的?不不不,还有jtree呢,当然table也好不到哪去。你现在也许刚接触所以有些茫然,swing就是这样,刚开始的时候乱七八糟。慢慢找到规律就好了。最近比较烦,不爱干活的时候就经常上来转。有时候不愿意说话,有时候又忍不住扯几句。swing怎么说呢书倒是不少。csdn资源不少,我还上传了点资源呢。大都是英文版,不过那些确实是好书。当然,说实话我也没全看完。所以对swing算是熟悉一些,却绝对算不得高手。
    而且我不知道你工作多久了,很多东西实际上是逻辑的组织关系,也就是通常所说的后台。这和前台,也就是界面应该是分离的。你应该把你的注意力更多低集中在数据上,而不是那些界面(我可不是说不注重啊)。
      

  8.   


    value == null ? "" : value.toString
    这个算我个人习惯了。为防止value为null。这应该是唯一的一个三元运算吧?
    意思是如果value 为null,那么赋值为空字符串,否则,就等于value的字符串表现。一般看到你提的需求都会立即想到加一个监听,通常是ListSelectionChangeListener。但是实际上JTable自身已经实现了这个接口。直接改写可以满足一般需求,当然很多时候为了代码结构和可读性,不采用改写而addXXXListener也是常有的,都可以。
    不改写也可以啊。其实直接在后面加只是一种方式。你可以更清晰地采用另外一种方式。等我把代码改一下。
      

  9.   

    以下是另一种方式,采用一个map做对应。这个方式比刚才的那个要好。建议用这个。而且这个跟你用什么model是独立的。即使你不改写model也无妨。package table.test;import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextArea;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.table.DefaultTableModel;public class TableTest extends JFrame { private static final long serialVersionUID = 1L;
    private List<List<Object>> data = new ArrayList<List<Object>>();
    private static final String[] COLUMN_NAMES = { "aa", "bb", "cc", "dd" };
    private JTextArea area = new JTextArea(4, 10); private HashMap<Integer, String> attachContentMap = new HashMap<Integer, String>(); public TableTest() {
    super();
    initData();
    Container c = getContentPane(); DefaultTableModel dataModel = new DefaultTableModel() {
    private static final long serialVersionUID = 1L; @Override
    public int getColumnCount() {
    return COLUMN_NAMES.length;
    } @Override
    public int getRowCount() {
    return data.size();
    } @Override
    public String getColumnName(int column) {
    return COLUMN_NAMES[column];
    } @Override
    public Object getValueAt(int row, int column) {
    Object value = data.get(row).get(column);
    return value == null ? "" : value.toString();
    } @Override
    public void setValueAt(Object value, int row, int column) {
    if (row < data.size() && column < COLUMN_NAMES.length) {
    data.get(row).set(column,
    value == null ? "" : value.toString()); fireTableDataChanged();
    }
    } @Override
    public boolean isCellEditable(int row, int column) {
    return false;
    }
    };
    final JTable table = new JTable(dataModel) {
    private static final long serialVersionUID = 1L; @Override
    public void valueChanged(ListSelectionEvent e) {
    int row = getSelectedRow();
    if (row >= 0) {
    Object obj = attachContentMap.get(new Integer(row));
    area.setText(obj == null ? "" : obj.toString());
    area.requestFocus();
    area.selectAll();
    }
    super.valueChanged(e);
    }
    };
    c.setLayout(new BorderLayout());
    c.add(new JScrollPane(table));
    JButton okButton = new JButton("OK");
    okButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) { int row = table.getSelectedRow();
    if (row >= 0) {
    attachContentMap.put(new Integer(row), area.getText()
    .trim());
    } }
    });
    c.add(okButton, BorderLayout.SOUTH);
    c.add(new JScrollPane(area), BorderLayout.EAST); setSize(600, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    } private void initData() {
    for (int i = 0; i < 20; i++) {
    List<Object> record = new ArrayList<Object>();
    record.add(String.valueOf(i + 1));
    record.add("aa");
    record.add("bb");
    record.add("cc");
    data.add(record);
    }
    } public static void main(String args[]) {
    new TableTest();
    }
    }
      

  10.   

    好,继续研究~~用ArrayList能建带JCheckBox或是JComboBox的表格么?
    Vector的话,用add(new Boolean(false));再重写下public Class getColumnClass()方法就行了,用ArrayList要怎么用?再~上次的那个就是http://topic.csdn.net/u/20090616/14/d4740ad1-100f-40b4-875a-80cccc38394e.html这里这个,最后我说得那个问题还存在,就是先把第2行改成3,再把第4行改成3时结果是和原来的第3行改,不是和新的第2行改~大大有空帮我研究下。再再~大大有QQ或msn么?偶估计还会有问题~~方便请教~
      

  11.   


    说得乱七八糟,但是如果想去掉JTextArea的内容,添加一行后,直接setText("")就行了啊
      

  12.   

    哦,抱歉。有一个地方写错了。
    第61行
    应该是
    Integer row2 = idToRowMap.get(oldValue);
    写成
    Integer row2 = idToRowMap.get(iValue);
      

  13.   

    不好意思。逻辑出现了一点混乱。呵呵。唉,也是我那几个变量给搞的。修正版~~
    主要是setValueAt方法里面修改map对应关系的地方出了问题。
    大大是个什么称呼哦?
    我的qq也很少上了。下周很可能又要出差。出差的话上网就可能受到很大的限制,不那么自由了。
    邮箱可用,但我未必能够及时看到。[email protected]。有事没事发个邮件,交个朋友。java这东西很强大~~强大的东西往往比较复杂-----------〉java很复杂
    标准三段论。那些说java简单的人除了极少数确实很牛,其他的恐怕一多半是人云亦云,剩下一半的一半是胡说八道,还有剩下的一半的另一半是盲人摸象,一叶障目,以偏概全,局限在接触过的那一小部分中。
    但运用相对论来说,又是会者不难,难者不会。唉,唐僧就是这样炼成的。这代码你再试一下。我刚才调试,改了几处。是昨天我的逻辑乱了。其实这的思路和刚才给你的第二份代码思路相同的,保持一个键--值关系的映射。这样找起来就方便了很多。看看吧~~要还有问题可以私信给我。邮件也成。import java.awt.BorderLayout;
    import java.awt.Container;
    import java.util.HashMap;
    import java.util.Vector;import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;public class ExchangeDemo extends JFrame {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Vector<Vector<Object>> data = new Vector<Vector<Object>>();
    private static final Vector<String> COLUMN_NAMES = new Vector<String>(); private int iCount = 0;
    // 用来存储id和行的对应关系,看着方便一点
    private HashMap<String, Integer> idToRowMap = new HashMap<String, Integer>(); public ExchangeDemo() {
    super();
    initData();
    Container c = getContentPane();
    final JTable table = new JTable();
    table.setModel(new DefaultTableModel(data, COLUMN_NAMES) { @Override
    public void setValueAt(Object value, int row, int column) { if (column == 0) {
    int iValue;
    try {
    iValue = Integer.parseInt(value.toString());
    } catch (Exception e) {
    // TODO: 这地方的判断小子自己做吧
    e.printStackTrace();
    return;
    } if (iValue - 1 >= data.size()) {
    // 这地方通常好的软件有一些比较强的处理,我就先拿这个顶了
    JOptionPane.showMessageDialog(table, "error");
    return;
    }
    if (row < data.size() && column < COLUMN_NAMES.size()) { Object oldValue = data.get(row).get(column); data.get(row).set(column,
    value == null ? "" : value.toString());
    data.get(idToRowMap.get(String.valueOf(value))).set(
    column, oldValue);
    //
    Integer row1 = idToRowMap.get(value);
    Integer row2 = idToRowMap.get(String.valueOf(oldValue));
    idToRowMap.put(value.toString(), row2);
    idToRowMap.put(String.valueOf(oldValue), row1);
    fireTableDataChanged();
    }
    } else if (column == 3) {
    Boolean b = (Boolean) value;
    iCount += b ? 1 : -1;
    JOptionPane.showMessageDialog(table, "选中个数:" + iCount);
    super.setValueAt(value, row, column); } else { super.setValueAt(value, row, column);
    }
    } //
    @Override
    public Class<?> getColumnClass(int columnIndex) {
    return data.get(0).get(columnIndex).getClass();
    }
    });
    c.setLayout(new BorderLayout());
    c.add(new JScrollPane(table));
    setSize(600, 400);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
    } private void initData() {
    for (int i = 0; i < 4; i++) {
    COLUMN_NAMES.add("column" + (i + 1));
    }
    for (int i = 0; i < 20; i++) {
    Vector<Object> record = new Vector<Object>();
    String id = String.valueOf(i + 1);
    record.add(id);
    record.add("aa");
    record.add("bb");
    record.add(new Boolean(false));
    data.add(record);
    idToRowMap.put(id, new Integer(i));
    }
    } public static void main(String args[]) {
    new ExchangeDemo();
    }
    }