To Do Liste

Hallo zusammen,

Ich programmiere noch nicht lange, deshalb benötige ich mal eure Hilfe.
Bei meiner To Do Liste bekomme ich folgenden Fehler angezeigt:
"This method add(Component) in the type Container is not applicable for the argument (task).

Was kann ich tun?

Vielen Dank im voraus!
 

Marinek

Bekanntes Mitglied
Hi,

also die Problematik ist, dass der Button AddTask heißt. Dieser ist in der Member Variable AddTask enthalten.

Dann da drüber machst du AddTask = getAddTask(); Was so viel macht wie AddTask = AddTask; und damit vermutlich sinnlos ist.

Ansonsten scheint es sich bei AddTask um ein JButton zu handeln.

Da wir nicht den ganzen Code sehen (=Das bedeutet bitte vollständig hier als TEXT posten und auf keinen Fall mit einem Handy schlecht fotografiert), gehe ich davon aus, dass AddTask in Wahrheit kein JButton ist.

Die Fehlermeldung passt auch nicht zum Quellcode, daher gehe ich davon aus, dass hier eine Compile Anweisung nicht durchgegangen ist, vermutlich wegen ganz anderer Fehler in anderen Klassen oder so. Die fehlerhafte Zeile ist auch durch die Fehlermeldung verdeckt ;)

Vermutungen, da die Informationen sehr wage sind.

Daher kann man konkreter als Kollege @Blender3D nicht werden.

Gruß,
Martin
 

M.L.

Top Contributor
Ausserdem könnte die verwendete IDE auch eine Auto-Vervollständigung anbieten, die bei der Code-Auswahl helfen kann.
 
Ich habe den Code mal hierein kopiert:
Java:
package Classes;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JFrame;

public class AppFrame extends JFrame{

    private TitleBar title;
    private List list;
    private ButtonPanel btnPanel;

    private JButton addTask;
    private JButton clear;

    //Constructor
    AppFrame()
    {
        this.setSize(400,700);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        title = new TitleBar();
        list = new List();
        btnPanel = new ButtonPanel();
        this.add(title,BorderLayout.NORTH);
        this.add(btnPanel,BorderLayout.SOUTH);

        this.add(list,BorderLayout.CENTER);

        addTask = btnPanel.getAddTask();
        clear = btnPanel.getClear();

        addListeners();
    }

    public void addListeners() {
        addTask.addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent e){
                Task task = new Task();
                list.add(task);
                revalidate();
            }

        }

);

(Mod-Edit - Code in Code-Tags gepackt)
 
Zuletzt bearbeitet von einem Moderator:

KonradN

Super-Moderator
Mitarbeiter
Code bitte immer in Code-Tags posten. Das geht am Einfachsten über den Knopf </> links oberhalb des Eingabebereiches. (Ich habe mir erlaubt, dein Post einmal zu editieren)

Beim Copy & Paste ist wohl auch etwas schief gegangen oder Du hast Da nicht korrekten Code. Am Ende das ");" ist nicht korrekt. Und zwei geschweifte Klammern wurden nicht geschlossen.



Edit: Wichtig: Die Idee mit der generischen List alleine ist nicht die Lösung. Das wäre ein wichtiger Ansatz für eine saubere Lösung aber es bedarf doch deutlich mehr, weshalb ich im folgenden Post etwas mehr geschrieben habe. Ich will diesen Absatz aber nicht einfach komplett löschen ...


Aber bezüglich Deiner Probleme: Was ist List für eine Klasse? Du hast eine Variable list vom Typ List aber keinerlei Import für List. Hast Du hier evtl. eine eigene Implementation einer Liste? Sowas ist unnötig. In Java kannst Du java.util.List (ein Interface) nutzen und dazu dann die Implementation, die am besten Deinen Bedürfnissen entspricht (oft wird java.util.ArrayList verwendet)
Das sind dann auch generische Klassen, d.h. Du musst angeben, was in der Liste gespeichert werden können soll. Wenn Du also eine Liste von Task Instanzen haben möchtest, dann wäre es etwas wie:
Java:
// Imports für List / ArrayList
import java.util.List;
import java.util.ArrayList;


public class AppFrame extends JFrame {
   
    // Deklaration der Variable
    private List<Task> list;
   
    AppFrame() {
       
        // initialisierung
        list = new ArrayList<>();
    }
}

Ich habe prinzipiell alles weggelassen und nur die notwendigen Parts sowie etwas Rahmen gepostet, so dass Du siehst, wo welche Änderung hin käme.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ach, ich sehe gerade ein wichtiges Detail: Die Klasse List ist ein Gui Element.

Sprich: Du hast eine Klasse List, welche nicht rein eine Liste von Tasks verwalten soll sondern die Klasse dient dem Anzeigen von Tasks und ist daher eine UI Komponente. Daher das Hinzufügen der Liste zu der UI:
this.add(list,BorderLayout.CENTER);
Und daher auch die Fehlermeldung, dass Du versuchst einen Task hinzu zu fügen aber die add Methode nur UI Komponenten in der add Methode entgegen nehmen möchte.

Daher muss man hier doch noch deutlich mehr ausholen fürchte ich.

Generell sollte man in Anwendungen Daten und Anzeige trennen. Das bedeutet, dass Du unabhängig von einem Frontend die Daten definieren solltest. Das ist das, was man oft Datenklassen oder Entities nennt sowie die Klassen rund um die Verwaltung.
Darauf setzt dann die UI auf.

Das kann dann bei Dir etwas sein wie:
  • Du hast die Klasse Task, die die Daten eines Tasks enthält.
  • In der Anwendung hast du dann eine List<Task> die alle Tasks der laufenden Anwendung vorhält.

In der UI hast Du dann von mir aus eigenständige Controls:
  • Ein TaskControl - dieses könnte dann eine Swing Komponente sein, die eine Instanz von Task übergeben bekommt und dann diesen Task anzeigt. Änderung an der UI würden dann in diese Instanz übertragen...
  • Dann kannst Du auch ein Control haben, dass eine Liste von Tasks anzeigt. Das wäre dann ähnlich: Dieses TaskListControl bekommt eine List<Tasks> übergeben. Die Tasks werden angezeigt, in dem für jeden Task in der Liste dann Instanzen der Klasse TaskControl erzeugt werden.

Das Zusammenspiel zwischen UI und Daten ist dann aber noch wichtig. So soll die UI ja Änderungen an den Daten anzeigen können. Dazu kann man dann das Observer Pattern ansehen. Das ObserverPattern besagt lediglich, dass bei Änderungen ein Event ausgelöst wird, das dann von der UI verwendet werden kann, um die Änderungen an den Daten zu übernehmen.

Das wäre die saubere Trennung, die man sich ansehen könnte.

Die evtl. für Dich einfachere Lösung könnte aber sein, dass die Daten in den Controls selbst gekapselt sind. D.h. deine Klasse List verwaltet intern die Tasks. Dann musst Du lediglich eine Methode public void addTask(Task task) hinzufügen. In der Methode kannst Du dann den Task in den Daten hinzu nehmen und darstellen.

Hier wird es aber problematisch, da Du ja nicht mitbekommst, wenn der Task nach der Übergabe noch geändert wird und so. Das ist also eine Lösung, die nur auf den ersten Blick einfach scheint, aber die schnell an gewisse Grenzen stößt und die auch schnell deutlich komplexer wird.
 

Ähnliche Java Themen


Oben