2015-01-06 4 views
0

Я работаю над небольшим проектом, который включает в себя JTable, который требует, чтобы пользователь нажал кнопку и добавил строку в таблицу (я назвал эту кнопку как addrow). Я использовал пользовательскую модель таблицы (Mytablemodel), которая расширяет модель таблицы по умолчанию. Моя таблица первая из пяти строк и 4 столбца, где после этого пользователь может нажать кнопку addrow, чтобы добавить больше строкКак вставить новую строку в JTable, используя пользовательскую модель таблицы?

Все в моем коде работает отлично, за исключением кнопки addrow, которая ничего не делает. Буду признателен за любую помощь.

public class AddingNewRows extends JFrame { 
JTable mytable; 
JButton addrow; 
String[] columns={"Admission number","Name","School","Year"}; 
TableColumn tc; 
int defaultrows=5; 
int rows=new Mytablemodel().getRowCount(),columnscount=new Mytablemodel().getColumnCount(); 
List data=new ArrayList(); 
Mytablemodel mytbm; 
// 
public AddingNewRows(){ 
super("adding rows"); 
for(int initialrows=0; initialrows<5; initialrows++){ 
    String[] items={"1","2","3","4"}; 
data.add(items); 
} 
mytbm=new Mytablemodel(); 
mytable=new JTable(mytbm); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.setAlignmentX(Component.RIGHT_ALIGNMENT); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 
public class Mytablemodel extends DefaultTableModel{ 

@Override 
public String getColumnName(int column) { 
    return columns[column]; 
} 
@Override 
public Object getValueAt(int row, int col){ 
return ((String[])data.get(row))[col]; 
} 
@Override 
public boolean isCellEditable(int row, int col){ 
    return true; 
} 
@Override 
public void setValueAt(Object value,int row, int col){ 
    ((Object[])data.get(row))[col]=value; 
    fireTableCellUpdated(row,col); 

} 
@Override 
public Class getColumnClass(int column){ 
    return getValueAt(0,column).getClass(); 
} 
@Override 
public int getColumnCount(){ 
    return columns.length; 
} 

@Override 
public int getRowCount(){ 
    return increaserows; 
} 

@Override 
public void addRow(Object[] mynewdata){ 
    int rownum=data.size(); 
    System.out.println(rownum); 
    data.add(madata); 
fireTableRowsInserted(rownum,rownum); 
} 

} 
// 
private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
    Object[]newdata={"","","",""}; 
    mytbm.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 

AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
    frame.setSize(400,400); 
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

} 
+1

Слова, напечатанные во всех нижних регистрах, трудно читать, например, пытаться выслушать кого-то, кто бормочет. Пожалуйста, используйте письмо в верхнем регистре в начале предложений, для слова I и собственные имена, такие как 'ArrayList' или Oracle. –

+1

'Mytablemodel расширяет AbstractTableModel {' Сделайте себе одолжение и вместо этого расширьте ** 'DefaultTableModel' **. Он делает этот тип вещей для вас. Но для лучшей помощи раньше, отправьте сообщение [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверяемый пример) или [SSCCE] (http://www.sscce.org/) (Short, Self Содержащийся, правильный пример). –

+0

@AndrewThompson все данные, введенные в таблицу, впоследствии сохраняются в базе данных через кнопку onther, и это отлично работает. вот почему я использовал пользовательскую модель таблицы, так как я не думаю, что могу использовать DefaultTableModel для сохранения данных в базе данных. кроме того, AM НЕОБХОДИМО ПРОБЛЕМЫ, ПОНИМАЮЩИЕ метод fireTableRowsInserted (int, int). параметры сами и где или когда вызывать метод –

ответ

2

Некоторые заметки о коде:

  • Вы никогда не должны вызывать какой-либо из методов fireXxx() явно из снаружи. Они должны называться внутренними подклассами AbstractTableModel при необходимости. Примечание: IMHO должны быть protected, а не public, чтобы избежать их неправильного использования. Но для почему-то они публиковали их.

  • Ваша кнопка addrow, похоже, создает новую модель таблицы, которая не является , прикрепленной к любому JTable, поэтому нет смысла. Ваша модель таблицы должна предоставить метод addRow(...), чтобы добавить к нему новую строку. В большинстве случаев , вероятно, вам придется увеличить двумерный массив, который представляет собой недоработанную структуру данных таблицы таблицы при каждом добавлении строки.

  • Как @AndrewThompson уже предложил, DefaultTableModel кажется хорошим совпадением, чтобы сделать то, что делает ваша модель таблицы.

  • Проверка rows и columnscount Инициализация объектов. Это не кажется мне прав.

С другой стороны, вы говорите, в комментарии:

У меня возникли проблемы с пониманием методы fireTableRowsInserted(int,int). параметры и сам себе, где и когда для вызова метода

Этот метод должен быть вызван в addRow(...), что я предложил вам создать во второй точке. Этот метод должен увеличить структуру данных и уведомить TableModelListeners о том, что новая строка/s была вставлена ​​/. Параметры - это первый и последний индексы соответственно. При добавлении новой отдельной строки в конец модели таблицы, как первый, так и последний индексы совпадают, а новый размер - 1 базовой структуры данных. Конечно, несколько строк могут быть вставлены и необязательно в конце таблицы, поэтому вам нужно выяснить соответствующие индексы. См. Приведенный пример here, который использует в качестве структуры данных List пользовательских объектов.

+0

19 когда вы говорите о первом и последнем индексах, что именно вы имеете в виду? например, у меня 5 строк, когда я хочу добавить 6-ю строку, могу ли я сказать fireTableRowsUpdated (6,6)? –

+0

В этом случае вы должны называть 'fireTableRowsInserted (5,5)' из-за индексов в начале начала Java с 0 (индекс 5 - это 6-я строка). Примечание. Я уведомил строки ***, вставленные *** (не * обновленные *), потому что вы хотите * добавить * новую строку на самом деле. @gikarasojokinene – dic19

+0

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

0

Согласно вашему вопросу, вы хотите добавлять новые строки каждый раз, когда пользователь нажимает кнопку addrow. Достичь своей цели с помощью DefaultTableModel без создания собственного или переопределяющего метода addrow. в моем примере ниже параметры в конструкторе DefaultTableModel представляют начальные строки (5) и столбцы (4), которые будут иметь таблица после выполнения, пользователь может добавить больше строк, нажав кнопку addrow.

public class AddingNewRows extends JFrame { 
DefaultTableModel def; 
JTable mytable; 
JButton addrow; 
// 
public AddingNewRows(){ 
super("adding rows"); 

def=new DefaultTableModel(5,4); 
mytable=new JTable(def); 

JScrollPane scroll=new JScrollPane(mytable); 
addrow=new JButton("ADD ROW"); 
// 
JPanel buttonpanel=new JPanel(); 
buttonpanel.setLayout(new BoxLayout(buttonpanel,BoxLayout.X_AXIS)); 
buttonpanel.add(addrow); 

// 
add(scroll,BorderLayout.CENTER); 
add(buttonpanel,BorderLayout.SOUTH); 

addrow.addActionListener(new Myactions()); 

} 

private class Myactions implements ActionListener{ 

@Override 
public void actionPerformed(ActionEvent event){ 
if(event.getSource()==addrow){ 
Object[]newdata={"","","",""}; 
def.addRow(newdata); 
} 
} 
} 
public static void main(String[] args) { 
AddingNewRows frame=new AddingNewRows(); 
frame.setVisible(true); 
frame.setSize(400,400); 
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

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