Default Table wird nicht angezeigt

TS2510

Mitglied
Liebe Mitglieder,
Ich hab das problem, dass mein Default Table innerhalb meiner Scrollpane nicht angezeigt wird.
Danke im voraus für jede Hilfe.
Code:
package firstTry;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import firstTry.MyButtonView.tblCalendarRenderer;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.GregorianCalendar;

public class EntryView extends JFrame {
    private static final long serialVersionUID=1L;
   
    static int day;
    static int nod;
    static int year;
    static int month;
    static int entrynmb;
    static int i;
    static String infor;
    static Entry[] entries = new Entry[1000];
    public EntryView(){
       
       
       
       
        JFrame frame = new JFrame();
        Container pane = frame.getContentPane();
        JTextField Day = new JTextField(25);
        JTextField Month = new JTextField(25);
        JTextField Year = new JTextField(25);
        JTextField info = new JTextField(80);
        JButton enter = new JButton("Enter");
        DefaultTableModel table = new DefaultTableModel(){public boolean isCellEditable(int rowIndex, int mColIndex){return false;}};
        JPanel panel = new JPanel(null);
        JLabel Tag = new JLabel("Tag");
        JLabel Monat = new JLabel("Monat");
        JLabel Jahr = new JLabel("Jahr");
        JTable tableE = new JTable();
        JScrollPane Entrys = new JScrollPane(tableE);
        i=0;
       
        String[] columnNames = {"Tag","Monat","Jahr","Info"};
       
       
        for (int a=0;a<4;a++)
        {
        table.addColumn(columnNames[a]);
        }
       
        tableE.getTableHeader().setResizingAllowed(false);
        tableE.getTableHeader().setReorderingAllowed(false);
        tableE.setColumnSelectionAllowed(true);
        tableE.setRowSelectionAllowed(true);
        tableE.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tableE.setRowHeight(25);
   
       
    pane.add(panel);
    panel.add(Month);
    panel.add(Year);
    panel.add(Day);
    panel.add(Tag);
    panel.add(Monat);
    panel.add(Jahr);
    panel.add(enter);
    panel.add(info);
    panel.add(Entrys);
    panel.add(tableE);
   
    /*Day.addActionListener(new textfieldd());
    Month.addActionListener(new textfieldm());*/
   
    enter.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e)
        {
        entries[i].Year=Year.getText();
        entries[i].Month=Month.getText();
        entries[i].Day =Day.getText();
        infor = info.getText();
        i++;
        for (int f=0;f<=i;f++)
        {
            tableE.setValueAt(entries[f], f, 1);
            tableE.setValueAt(entries[f], f, 2);
            tableE.setValueAt(entries[f], f, 3);
            tableE.setValueAt(entries[f], f, 4);
       
        }
        }
    });
    /*info.addActionListener(new infolisten());*/

   
    frame.setVisible(true);
    frame.setSize(420, 600);
    panel.setBounds(0, 0, 400, 400);
    Month.setBounds(10, 10, 40, 20);
    Day.setBounds(10, 35, 40, 20);
    Year.setBounds(10, 60, 40, 20);
    Tag.setBounds(55,10,60,20);
    Monat.setBounds(55,35,40,20);
    Jahr.setBounds(55,55,30,20);
    info.setBounds(10,85,80,20);
    enter.setBounds(10,110,70,20);
    Entrys.setBounds(10,135,380,300);
   
     GregorianCalendar cal = new GregorianCalendar();
     int realDay = cal.get(GregorianCalendar.DAY_OF_MONTH);
     int realMonth = cal.get(GregorianCalendar.MONTH);
     int realYear = cal.get(GregorianCalendar.YEAR);
     int currentMonth = realMonth;
     int currentYear = realYear;   
    
     GregorianCalendar cal1 = new GregorianCalendar(realYear,realMonth,1);
     nod=cal1.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);
    
     tableE.setDefaultRenderer(tableE.getColumnClass(0), new tblCalendarRenderer());

     class tblCalendarRenderer extends DefaultTableCellRenderer{
            public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){
                super.getTableCellRendererComponent(table, value, selected, focused, row, column);
                if (column == 0 || column == 6){
                    setBackground(new Color(255, 220, 220));
                }
                else{
                    setBackground(new Color(255, 255, 255));
                }
               
                setBorder(null);
                setForeground(Color.black);
                return this;
            }
        }
}
 
Du solltest dein DefaultTableModel deiner JTable zuweisen:
Java:
JTable tableE = new JTable(table);

EDIT: Übrigens, du setzt deine JTable zweimal in deinem JFrame. Da du eine eigene Klasse verwendest (firstTry.MyButtonView.tblCalendarRenderer), die du nicht gepostet hast, kann ich den Code leider nicht zum Laufen bringen. Ich weiß nicht, ob es Sinn macht, deine JTable einmal in den Viewport deines JScrollPanes und gleichzeitig in dein JPanel zu setzen.
 
Zuletzt bearbeitet:
Das ist die Entry Klasse.
Sie enthält nur vier Strings.
Der getter und setter werden eigentlich nicht verwendet.
Code:
package firstTry;

public class Entry {

    public String info,Day, Month, Year;
   
    public void makeEntry(String day,String month,String year, String info)
    {
        Day = day;
        Month = month;
        Year = year;
        this.info = info;
    }
   
    public String getEntry()
    {
        return this.toString();
    }
}
 
Java:
panel.add(tableE);
muss raus.

Außerdem hast du dein Entry-Objekt beim ActionEvent nicht initialisiert:

Java:
enter.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e)
        {      
        entries[i] = new Entry();
        entries[i].Year=Year.getText();
        entries[i].Month=Month.getText();
        entries[i].Day =Day.getText();
        infor = info.getText();
        table.addRow(entries);
        i++;
        for (int f=0;f<=i;f++)
        {
            tableE.setValueAt(entries[f].Day, f, 1);
            tableE.setValueAt(entries[f].Month, f, 2);
            tableE.setValueAt(entries[f].Year, f, 3);
            tableE.setValueAt(entries[f].info, f, 4);
 
        }
        }
    });

Achte auch darauf, dass deinem tableE.setValueAt die richtigen Parameter übergibst. In deinem Code hast du entries[f] übergeben. Du solltest allerdings die Strings Day, Month, Year, info übergeben.

Damit sollte es funktionieren 🙂 Zumindest tut es das bei mir
 
Zuletzt bearbeitet:
Die Table wird mir nun in der Scrollpane angezeigt, jedoch, dass mit den neuen Beiträgen hinzufügen klappt noch nicht, woran könnte das liegen?
 
Du hattest
Java:
tableE.setValueAt(entries[f], f, 1);
in der actionPerformed-Methode.
Richtig ist
Java:
tableE.setValueAt(entries[f].Day, f, 1);
// etc.
 
Code:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at firstTry.EntryView$2.actionPerformed(EntryView.java:80)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
 
Im for-loop der actionPerformed-Methode solltest du f<=i zu f<i ändern.
Mit dem Code bekomme ich es alles zum Laufen ohne Exception:

Java:
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.GregorianCalendar;



public class EntryView extends JFrame {
    private static final long serialVersionUID=1L;
 
    static int day;
    static int nod;
    static int year;
    static int month;
    static int entrynmb;
    static int i;
    static String infor;
    static Entry[] entries = new Entry[1000];
  
  
    public static void main(String[] args) {
        new EntryView();
    }
  
    public EntryView(){                   
        JFrame frame = new JFrame();
        Container pane = frame.getContentPane();
        JTextField Day = new JTextField(25);
        JTextField Month = new JTextField(25);
        JTextField Year = new JTextField(25);
        JTextField info = new JTextField(80);
        JButton enter = new JButton("Enter");
        DefaultTableModel table = new DefaultTableModel(){public boolean isCellEditable(int rowIndex, int mColIndex){return false;}};
        JPanel panel = new JPanel(null);
        JLabel Tag = new JLabel("Tag");
        JLabel Monat = new JLabel("Monat");
        JLabel Jahr = new JLabel("Jahr");
        JTable tableE = new JTable(table);      
        JScrollPane Entrys = new JScrollPane(tableE);
        i=0;
     
        String[] columnNames = {"Tag","Monat","Jahr","Info"};
     
     
        for (int a=0;a<4;a++)
        {
        table.addColumn(columnNames[a]);
        }
     
        tableE.getTableHeader().setResizingAllowed(false);
        tableE.getTableHeader().setReorderingAllowed(false);
        tableE.setColumnSelectionAllowed(true);
        tableE.setRowSelectionAllowed(true);
        tableE.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        tableE.setRowHeight(25);
 
     
    pane.add(panel);
    panel.add(Day);
    panel.add(Month);
    panel.add(Year);  
    panel.add(Tag);
    panel.add(Monat);
    panel.add(Jahr);
    panel.add(enter);
    panel.add(info);
    panel.add(Entrys);
    //panel.add(tableE);
 
    /*Day.addActionListener(new textfieldd());
    Month.addActionListener(new textfieldm());*/
 
    enter.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e)
        {          
        entries[i] = new Entry(Day.getText(), Month.getText(), Year.getText(), info.getText());
      
        table.addRow(entries);
        i++;
        for (int f=0;f<i;f++)
        {
            tableE.setValueAt(entries[f].Day, f, 0);
            tableE.setValueAt(entries[f].Month, f, 1);
            tableE.setValueAt(entries[f].Year, f, 2);
            tableE.setValueAt(entries[f].info, f, 3);
     
        }
        }
    });
    /*info.addActionListener(new infolisten());*/

 
    frame.setVisible(true);
    frame.setSize(420, 600);
    panel.setBounds(0, 0, 400, 400);
    Month.setBounds(10, 10, 40, 20);
    Day.setBounds(10, 35, 40, 20);
    Year.setBounds(10, 60, 40, 20);
    Tag.setBounds(55,10,60,20);
    Monat.setBounds(55,35,40,20);
    Jahr.setBounds(55,55,30,20);
    info.setBounds(10,85,80,20);
    enter.setBounds(10,110,70,20);
    Entrys.setBounds(10,135,380,300);
 
     GregorianCalendar cal = new GregorianCalendar();
     int realDay = cal.get(GregorianCalendar.DAY_OF_MONTH);
     int realMonth = cal.get(GregorianCalendar.MONTH);
     int realYear = cal.get(GregorianCalendar.YEAR);
     int currentMonth = realMonth;
     int currentYear = realYear;
 
     GregorianCalendar cal1 = new GregorianCalendar(realYear,realMonth,1);
     nod=cal1.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);      
   
    tableE.setDefaultRenderer(tableE.getColumnClass(0), new tblCalendarRenderer());

   
    }
  
    class Entry {

    public String info,Day, Month, Year;
 
    public Entry(String day,String month,String year, String info)
    {
        Day = day;
        Month = month;
        Year = year;
        this.info = info;
    }
 
    public String getEntry()
    {
        return this.toString();
    }
}
  
    class tblCalendarRenderer extends DefaultTableCellRenderer{
            public Component getTableCellRendererComponent (JTable table, Object value, boolean selected, boolean focused, int row, int column){
                super.getTableCellRendererComponent(table, value, selected, focused, row, column);
                if (column == 0 || column == 6){
                    setBackground(new Color(255, 220, 220));
                }
                else{
                    setBackground(new Color(255, 255, 255));
                }
             
                setBorder(null);
                setForeground(Color.black);
                return this;
            }
        }
}

Das einzige was mir auffiel, war, dass es irgendwo einen Dreher in deinem TableModel und/oder deiner TextFields gibt. In der Tagesspalte werden die Daten des Monats und in der Monatsspalte die Daten des Tages eingetragen.
 

Zurück
Oben