2015-05-18 4 views
0

Мне нужно отредактировать таблицу, когда пользователь дважды щелкает по строке, с новыми значениями. Я попробовал метод setValuesAt, но ничего не сделал.Редактирование Jtable с двойным щелчком

Это то, что я получил до сих пор, но я не знаю, как установить новые значения в Jtable.

public class Table extends JFrame { 

     private JTable table; 
     private JScrollPane jsPane; 
     private DefaultTableModel model; 
     private JPanel dialogPanel; 
     private JTextField tf[]; 
     private JLabel lbl[]; 
     private JPanel panel; 

     Object[] columns = new Object[]{"Name", "Last Name", "ID", "Email"}; 
     Object[][] inData ; 

     public void prepareAndShowGUI() { 

      setTitle("Overview"); 

      model = new DefaultTableModel() { 

       @Override 
       public boolean isCellEditable(int row, int column) { 
        return false; 
       } 

      }; 

      model.setColumnIdentifiers(columns); 

      table = new JTable(model); 

      for (int i = 1; i <= 10; i++) { 
       model.addRow(new Object[]{"a", "s", "w", "e"}); 
      } 

      jsPane = new JScrollPane(table); 

      table.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        if (e.getClickCount() == 2) { 

         int x = e.getX(); 
         int y = e.getY(); 
         int row = table.rowAtPoint(new Point(x, y)); 
         int col = table.columnAtPoint(new Point(x, y)); 

         String array[] = new String[table.getColumnCount()]; 
         for (int i = 0; i < array.length; i++) { 
          array[i] = (String) table.getValueAt(row, i); 
         } 
         populateTextField(array); 
         JOptionPane.showMessageDialog(null, dialogPanel, "Information", JOptionPane.INFORMATION_MESSAGE); 

         String[] values = new String[tf.length]; 
         for (int i = 0; i < tf.length; i++) { 
          values[i] = tf[i].getText(); 

         } 
         model.setValueAt(values, row, row); 

        } 

       } 
      }); 

      panel = new JPanel(new BorderLayout()); 

      JPanel panel1 = new JPanel(); 
      panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); 

      panel.add(panel1, BorderLayout.NORTH); 
      panel.add(jsPane, BorderLayout.CENTER); 
      getContentPane().add(panel); 

      pack(); 
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      setLocationRelativeTo(null); 
      prepareDialogPanel(); 

      setVisible(true); 
     } 

     private void prepareDialogPanel() { 

      dialogPanel = new JPanel(); 
      int col = table.getColumnCount(); 
      dialogPanel.setLayout(new GridLayout(col, 1)); 
      tf = new JTextField[col]; 
      lbl = new JLabel[col]; 

      for (int i = 0; i < col; i++) { 
       lbl[i] = new JLabel(table.getColumnName(i)); 
       tf[i] = new JTextField(10); 

       dialogPanel.add(lbl[i]); 
       dialogPanel.add(tf[i]); 

      } 
     } 

     private void populateTextField(String[] s) { 
      for (int i = 0; i < s.length; i++) { 
       tf[i].setText(s[i]); 

      } 
     } 

    } 
public static void main(String st[]) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       Table td = new Table(); 
       td.prepareAndShowGUI(); 
      } 
     }); 

} 
+0

Вы прочитали документацию или учебник? – SevenBits

+1

Вы отлаживали свою программу, чтобы узнать, что она делает, когда она работает, и почему она не ведет себя так, как вы ее ожидаете? Если бы это была моя проблема, я бы начала. –

ответ

3

Для начала, вы должны сделать вашу модель для редактирования, так что изменить эту строку:

model = new DefaultTableModel() { 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     return false; 
    } 

}; 

To:

model = new DefaultTableModel() { 

    @Override 
    public boolean isCellEditable(int row, int column) { 
     return true; //use the row and col to determine which 
        //cells are editable. If you want all, have this return true. 
    } 

}; 

Это будет вызывать DefaultCellEditor JTable, которая будет вызывать на метод setValueAt модели, когда пользователь внес изменения в редактирование.

Все эти компоненты могут быть заменены на пользовательские компоненты для выполнения различных действий.

Вот официальная Oracle документация на объекты JTable:

https://docs.oracle.com/javase/tutorial/uiswing/components/table.html

Если вы пытаетесь получить ваш диалог для работы, проблема заключается в этих линии:

String[] values = new String[tf.length]; 
for (int i = 0; i < tf.length; i++) { 
    values[i] = tf[i].getText(); 
} 
model.setValueAt(values, row, row); 

в основном те setValueAt работает только на основе ячейки по ячейкам. Вы не можете обновить целую строку следующим образом. Вместо этого попробуйте:

for(int i=0;i<tf.length;i++) 
{ 
    model.setValueAt(tf[i].getText(), row, i); 
} 
+0

Возможно, я читаю его код неправильно, но похоже, что он действительно не хочет этого делать. Вместо этого он хочет двойной щелчок, чтобы открыть диалоговое окно, в котором данные ячейки редактируются, а затем обновляется модель JTable. Разрешить прямое манипулирование JTable-ячейками было бы неприятно. Если я прав, то ваша рекомендация неверна. Или, может быть, вы правы, и его проблема XY, где лучше всего использовать редактор пользовательских ячеек ... трудно сказать. –

+0

Я прочитал его вопрос, как вы его отредактируете двумя щелчками. Если вопрос изменится, чтобы сказать, что он хочет отдельное окно для выполнения редактирования, я изменю свой ответ. – lordoku

+0

Я пошел вперед и обновил свой ответ, чтобы включить другой случай. В настоящее время он ждет рассмотрения экспертами до того, как он появится. – lordoku

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