2016-04-08 11 views
0

so was ich tun möchte, ist ein JTable aktualisieren, wenn eine Taste gedrückt wird. Ich verwende ein DefaultTableModel als Quelle. Tabellenklasse:Update JTable von DefaultTableModel

import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import java.awt.Dimension; 

public class TableDemo extends JPanel { 
    String[] columnNames = {"Tipo","Cantidad"}; 
    DefaultTableModel dtm = new DefaultTableModel(null,columnNames); 
    final JTable table = new JTable(dtm); 

public TableDemo() { 
    table.setPreferredScrollableViewportSize(new Dimension(500, 700)); 
    table.setFillsViewportHeight(true); 
    JScrollPane scrollPane = new JScrollPane(table); 
    add(scrollPane); 
} 

public void addRow(Object [] row) 
{ 
    dtm.addRow(row); 
} 

} 

die Formularklasse:

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.DefaultComboBoxModel; 
import javax.swing.JButton; 
import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextField; 

public class MyForm extends JFrame { 

JPanel panel; 
JLabel label; 
JTextField txtName; 
JTextField txtSurname; 
JButton btnAccept; 
TableDemo tb = new TableDemo(); 

public MyForm(){ 
    initControls(); 
} 

private void initControls() { 
    setTitle("Form Example"); 
    setSize(600, 400); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    setLocationRelativeTo(null); 

    panel = new JPanel();  
    panel.setLayout(null); 

    label = new JLabel("Welcome to Swing"); 
    label.setBounds(50, 10, 200, 30); 

    txtName = new JTextField(); 
    txtName.setBounds(50, 50, 200, 30); 

    txtSurname = new JTextField(); 
    txtSurname.setBounds(270, 50, 200, 30); 

    btnAccept = new JButton("Add"); 
    btnAccept.setBounds(120, 100, 150, 30); 

    onAcceptClick(); 
    TableDemo tablePanel = new TableDemo(); 

    panel.add(label); 
    panel.add(txtName); 
    panel.add(txtSurname); 
    panel.add(btnAccept); 

    JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
      tablePanel,panel); 
    splitPane.setDividerLocation(205); 
    splitPane.setEnabled(false); 

    getContentPane().add(splitPane); 
} 

private void onAcceptClick() { 
    btnAccept.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      tb.addRow(new Object[]{"taza",txtName.getText()}); 

     } 
    }); 
public static void main(String[] args) { 
    //Initilizer init = new Initilizer(); 

    Runnable init = new Runnable() { 

     @Override 
     public void run() { 
      MyForm form = new MyForm(); 
      form.setVisible(true); 
     } 
    }; 

    SwingUtilities.invokeLater(init); 
} 
} 

Wie Sie i rufen Sie die Funktion addRow sehen können, aber in nie aktualisiert im JTable, was bin ich dabei? Thnx

Antwort

4

Sie erstellen zwei TableDemo-Objekte - eines, das Sie der GUI hinzufügen, tablePanel, das andere, dem Sie eine Zeile hinzufügen, tb;

// ... 

TableDemo tb = new TableDemo(); // TableDemo #1. Never displayed 

private void initControls() { 
    // ... 

    TableDemo tablePanel = new TableDemo(); // TableDemo #2 

    // ... 

    // TableDemo #2 is here added to the GUI 
    JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, tablePanel,panel); 

    // ... 
} 

btnAccept.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     // here you add a row to the non-displayed TableDemo #1 
     tb.addRow(new Object[]{"taza",txtName.getText()}); 
    } 
}); 

Lösung: Tun Sie das nicht (offensichtlich)! Verwenden Sie nur eine TableDemo-Instanz, zeigen Sie sie an und nehmen Sie Änderungen daran vor. Entfernen Sie also die Variable tablePanel und verwenden Sie nur die Variable tb.

Andere Probleme:

  • Sie null Layouts verwenden. Während Null-Layouts und setBounds() Swing-Neulinge wie die einfachste und beste Möglichkeit erscheinen, komplexe GUI's zu erstellen, erzeugen Sie mit der Swing GUI'S die ernsteren Schwierigkeiten, denen Sie begegnen werden, wenn Sie sie benutzen. Sie werden die Größe Ihrer Komponenten nicht ändern, wenn die GUI die Größe ändert, sie sind eine royale Hexe, die verbessert oder beibehalten wird, sie scheitern komplett, wenn sie in Scrollpanels platziert werden. Sie sehen auf allen Plattformen oder Bildschirmauflösungen, die sich vom Original unterscheiden, grässlich aus .
Verwandte Themen