Swing Tabelle wird bei Betätigung des Button nicht befüllt

Alex2013

Bekanntes Mitglied
Hallo Leute,

ich habe ein kleines Tabellenprogramm erstellt. Testweise um zu prüfen, ob es überhaupt funktioniert.
Das Nachrichtenfeld wird auch jeweils beim Drücken des Jeweiligen Buttons angepasst, aber im Hauptfeld, wo der Datensatz zu sehen sein soll, passiert nichts.
Wo liegt hier der Fehler, dass die Daten nicht angezeigt werden?

Hier der Code:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import net.miginfocom.swing.MigLayout;

import javax.swing.JTable;

import java.awt.Dimension;

import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JLabel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Test extends JFrame {

    private JPanel contentPane;
    private JTable table;
    private JTextField eingBez;
    private JTextField eingPreis;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        new Test();
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test frame = new Test();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Test() {
        setSize(500, 800);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new MigLayout("", "[][][][][][grow][][][][grow]", "[][][][][grow]"));
       
        JLabel bezeichnung = new JLabel("Bezeichnung");
        contentPane.add(bezeichnung, "cell 0 0,alignx trailing");
        JLabel nachricht = new JLabel("Nachricht");
        eingBez = new JTextField();
        contentPane.add(eingBez, "cell 1 0,growx");
        eingBez.setColumns(10);
       
        JLabel kategorie = new JLabel("Kategorie");
        contentPane.add(kategorie, "cell 0 1,alignx trailing");
        String objekte[]={"Lebensmittel","Möbel","Elektronik","Textilien","Kfz","Sonstiges"};
        JComboBox auswahl = new JComboBox(objekte);
        auswahl.setName("Auswahl");
        contentPane.add(auswahl, "cell 1 1,growx");
       
        JLabel preis = new JLabel("Preis");
        contentPane.add(preis, "cell 0 2,alignx trailing");
       
        eingPreis = new JTextField();
        contentPane.add(eingPreis, "cell 1 2,growx");
        eingPreis.setColumns(10);
       
        JButton hinzufuegen = new JButton("Hinzuf\u00FCgen");
        hinzufuegen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            if(!eingBez.getText().trim().equals("")||!eingBez.getText().trim().equals(" "))
            {
                model.addRow(new Object[]{eingBez.getText(),auswahl.getSelectedItem().toString(),eingPreis.getText()});
            }
            if(!eingBez.getText().equals("")||!eingBez.getText().equals(" "))
            {
                model.addRow(new Object[]{eingBez.getText(),auswahl.getSelectedItem().toString(),eingPreis.getText()});
            }
            else
            {
                nachricht.setText("Sie müssen Eingaben tätigen x1");
            }
            }
        });
        contentPane.add(hinzufuegen, "cell 0 3");
       
        JButton loeschen = new JButton("L\u00F6schen");
        loeschen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                DefaultTableModel model=(DefaultTableModel)table.getModel();
                if(table.getSelectedRow()==-1)
                {
                    if(table.getRowCount()==0)
                    {
                        nachricht.setText("Die Tabelle ist leer");
                    }else
                    {
                        nachricht.setText("Sie müssen ein Produkt auswählen x2");
                    }
                }else
                {
                    model.removeRow(table.getSelectedRow());
                }
            }
        });
        contentPane.add(loeschen, "cell 1 3");
       
        JButton aktualisieren = new JButton("Aktualisieren");
        aktualisieren.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            if(table.getSelectedRow()==-1)
            {
                if(table.getRowCount()==0)
                {
                    nachricht.setText("Die Tabelle ist leer");
                }else
                {
                    nachricht.setText("Sie müssen ein Produkt auswählen x3");
                }
            }else
            {
            model.setValueAt(eingBez.getText(), table.getSelectedRow(), 0);
            model.setValueAt(auswahl.getSelectedItem().toString(), table.getSelectedRow(), 1);
            model.setValueAt(eingPreis.getText(), table.getSelectedRow(), 2);
            }
            }
        });
        contentPane.add(aktualisieren, "cell 3 3");
       
       
        contentPane.add(nachricht, "cell 0 4");
       
        table = new JTable();
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            eingBez.setText(model.getValueAt(table.getSelectedRow(), 0).toString());
            auswahl.setSelectedItem(model.getValueAt(table.getSelectedRow(), 1).toString());
            eingPreis.setText(model.getValueAt(table.getSelectedRow(),2).toString());
            }
        });
        table.setName("Tabelle");
        table.setPreferredSize(new Dimension(400, 100));
        contentPane.add(table, "cell 1 4,grow");
        setVisible(true);
    }

}

Für hilfreiche Tipps oder sogar eine Lösung wäre ich dankbar.

LG
 
Bei dieser Zeile kommt eine Warnung:
Java:
// JComboBox is a raw type. References to generic type JComboBox<E> should be parameterized
JComboBox auswahl = new JComboBox(objekte);
Ich habe sie als Kommentar dazugeschrieben

Das mit dem Oder verstehe ich nicht. Die Zeile
Java:
                if (!eingBez.getText().trim().equals("")  || !eingBez.getText().trim().equals(" ") ) {
kann man auch so schreiben:
Java:
                if (eingBez.getText().trim().equals("") == false || eingBez.getText().trim().equals(" ") == false) {
Aber was meinst du überhaupt mit der Zeile?

Weiter unten hast du dasselbe aber ohne trim.
 
Bei dieser Zeile kommt eine Warnung:
Ich habe sie als Kommentar dazugeschrieben
Ja stimmt hier sollte
Java:
JComboBox<String> auswahl = new JComboBox<>(objekte);
stehen, ist aber nicht der Grund warum nichts angezeigt wird.
Das mit dem Oder verstehe ich nicht. Die Zeile
kann man auch so schreiben:
Aber was meinst du überhaupt mit der Zeile?
Man kann das ganze einfacher schreiben, wenn man weiß was String::trim macht! Es gibt einen String zurück ohne whitespaces, also ist die Abfrage auf ....trim().equals(" ") sinnlos. Auch ist es schlechter Programmierstil auf ... = false zu prüfen, die Negation hat hier schon gepasst!
Generell kann man die Zeile vereinfachen auf:
Java:
if(!eingBez.getText().trim().isEmpty()) { ...

Warum nichts angezeigt wird, liegt an deinem TableModel, da es einen ColumCount von 0 besitzt. Setze doch einfach den auf 3, dann siehst du auch deine Zeilen in der Tabelle!
 
Ich habe das mal etwas angepasst und auch den ColumnCount auf 3 gesetzt.
Mir wird aber weiterhin (auch nach einer Eingabe) nur das Folgende angezeigt:
 

Anhänge

  • Programm.png
    Programm.png
    10,9 KB · Aufrufe: 39
Bei mir funktioniert der Code, bis auf die Tatsache, dass bei einem Mausklick zwei neuen Zeilen angezeigt werden.
Zeig mal deinen aktuellen Code.
 
Hier ist mein aktueller Code:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;

import net.miginfocom.swing.MigLayout;

import javax.swing.JTable;

import java.awt.Dimension;

import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JLabel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;


public class Test extends JFrame {

    private JPanel contentPane;
    private JTable table;
    private JTextField eingBez;
    private JTextField eingPreis;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test frame = new Test();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Test() {
        setSize(600, 800);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(new MigLayout("", "[][][][][][grow][][][][grow]", "[][][][][grow]"));
       
        JLabel bezeichnung = new JLabel("Bezeichnung");
        contentPane.add(bezeichnung, "cell 0 0,alignx trailing");
        JLabel nachricht = new JLabel("Nachricht");
        eingBez = new JTextField();
        contentPane.add(eingBez, "cell 1 0,growx");
        eingBez.setColumns(3);
       
        JLabel kategorie = new JLabel("Kategorie");
        contentPane.add(kategorie, "cell 0 1,alignx trailing");
        String objekte[]={"Lebensmittel","Möbel","Elektronik","Textilien","Kfz","Sonstiges"};
        JComboBox auswahl = new JComboBox(objekte);
        auswahl.setName("Auswahl");
        contentPane.add(auswahl, "cell 1 1,growx");
       
        JLabel preis = new JLabel("Preis");
        contentPane.add(preis, "cell 0 2,alignx trailing");
       
        eingPreis = new JTextField();
        contentPane.add(eingPreis, "cell 1 2,growx");
        eingPreis.setColumns(10);
       
        JButton hinzufuegen = new JButton("Hinzuf\u00FCgen");
        hinzufuegen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            if(!eingBez.getText().trim().equals(""))
//            if(!eingBez.getText().trim().isEmpty())
            {
                model.addRow(new Object[]{eingBez.getText(),auswahl.getSelectedItem().toString(),eingPreis.getText()});
            }
            if(!eingBez.getText().equals(""))
            {
                model.addRow(new Object[]{eingBez.getText(),auswahl.getSelectedItem().toString(),eingPreis.getText()});
            }
            else
            {
                nachricht.setText("Sie müssen Eingaben tätigen x1");
            }
            }
        });
        contentPane.add(hinzufuegen, "cell 0 3");
       
        JButton loeschen = new JButton("L\u00F6schen");
        loeschen.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                DefaultTableModel model=(DefaultTableModel)table.getModel();
                if(table.getSelectedRow()==-1)
                {
                    if(table.getRowCount()==3)
                    {
                        nachricht.setText("Die Tabelle ist leer");
                    }else
                    {
                        nachricht.setText("Sie müssen ein Produkt auswählen x2");
                    }
                }else
                {
                    model.removeRow(table.getSelectedRow());
                }
            }
        });
        contentPane.add(loeschen, "cell 1 3");
       
        JButton aktualisieren = new JButton("Aktualisieren");
        aktualisieren.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            if(table.getSelectedRow()==-1)
            {
                if(table.getRowCount()==3)
                {
                    nachricht.setText("Die Tabelle ist leer");
                }else
                {
                    nachricht.setText("Sie müssen ein Produkt auswählen x3");
                }
            }else
            {
            model.setValueAt(eingBez.getText(), table.getSelectedRow(), 0);
            model.setValueAt(auswahl.getSelectedItem().toString(), table.getSelectedRow(), 1);
            model.setValueAt(eingPreis.getText(), table.getSelectedRow(), 2);
            }
            }
        });
        contentPane.add(aktualisieren, "cell 3 3");
       
       
        contentPane.add(nachricht, "cell 1 5");
       
        table = new JTable();
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
            DefaultTableModel model=(DefaultTableModel)table.getModel();
            eingBez.setText(model.getValueAt(table.getSelectedRow(), 0).toString());
            auswahl.setSelectedItem(model.getValueAt(table.getSelectedRow(), 1).toString());
            eingPreis.setText(model.getValueAt(table.getSelectedRow(),2).toString());
            }
        });
        table.setName("Tabelle");
        table.setPreferredSize(new Dimension(400, 100));
        contentPane.add(table, "cell 1 4,grow");
    }
}
 
Du setzt nirgends dein ColumnCount. Deine Initialisierung der JTable sollte so aussehen:
Java:
table = new JTable(new DefaultTableModel(0, 3));
 
Ich habe das gerade noch einmal versucht abzuändern, bzw. es in verschiedenen Varianten versucht. Es wird aber weiterhin nichts angezeigt.
Bzw. bei dem testen einer Variante wird eine out of Range Exception geschmissen.
 
Ich habe nun miglayout-4.0-swing.jar eingebunden und konnte es testen.

Wenn ich es so mache wie Flown meinte, dann kann ich Daten hinzufügen.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    8,7 KB · Aufrufe: 42
:-O ?
Kannst du einmal das Programm hier reinstellen? Dann kann ich sehen, was du anders gemacht hast als ich.
Das gibts doch nicht :-/
 

Zurück
Oben