Components werden im Frame nicht angezeigt

Also ich stell mich mal kurz vor, ich bin die Isabell, 19 Jahre und absolviere der Zeit eine Ausbildung zur Fachinformatikerin für Anwendungsentwicklung. Ich hab schon
Erfahrungen im Programmieren aber GUI’s machen mich grad fertig. Was mich zu meinem aktuellen Problem führt.

Ich möchte eine To-Do Liste mit einer GUI darstellen und ja hab mir da auch schon was überlegt und hab eigentlich alles gemacht bis auf das Textfeld für die Eingabe
der Aufgaben und die Liste. So ich wollte es mal antesten aber es ist irgendwie nix auf dem Panel zu sehen. Es ist einfach nur ein grauer Kasten. Ja ich weiß es ist
hundert pro nur eine Kleinigkeit die ich da übersehen hab aber nach 7 Std Java Code heute find ich den dummen Fehler nicht. Wäre nett wenn jemand mal drüber schauen
könnte. Im Anhang ein Bild wie ich mir das Ganze so vorgestellt habe.

PS: Ja ich weiß ganz oben die Components stehen NOCH doppelt drin. War aber ein Vorschlag einer offiziellen Seite im Internet zu ActionListener und ich werde es später
noch optimieren, ich will erstmal das das Programm läuft. Danke schon mal vor ab. :slight_smile:

[SPOILER]```package gui;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ToDoList extends JFrame implements ActionListener{
//ActionListener Components
JButton btn_add;
JButton btn_remove;
String ToDoinput;

public ToDoList (){
	
	//Components
	JButton btn_add = new JButton(" + ");
	JButton btn_remove = new JButton(" - ");
	btn_add.addActionListener(this);
	btn_remove.addActionListener(this);
	JLabel lbl_intro = new JLabel("Below you can see your undone tasks. To add or remove tasks use the plus and minus button on the right.");	
	JList list = new JList();
	//Container
	Container con_1 = new Container();
	Container con_2 = new Container();
	Container con_3= new Container();
	Container con_4 = new Container();
	Container con_5 = new Container();
	Container con_6 = new Container();
	//Input
	JTextField txtfield = new JTextField();
	String ToDoinput = txtfield.getText();
	//Panel and Frames
	JFrame frame = new JFrame();
	frame.setTitle("ToDo-List");
	JPanel pnl_1 = new JPanel();
	BorderLayout mainlayout = new BorderLayout();
	BoxLayout sidelayout = new BoxLayout(con_3,BoxLayout.PAGE_AXIS);
	pnl_1.setLayout(mainlayout);
	con_3.setLayout(sidelayout);
	//adds
	frame.add(pnl_1);
	pnl_1.add(con_1,BorderLayout.PAGE_START );
	pnl_1.add(con_2,BorderLayout.LINE_START );
	pnl_1.add(con_3,BorderLayout.CENTER );
	con_3.add(con_4);
	con_3.add(con_5);
	pnl_1.add(con_6,BorderLayout.PAGE_END );
	con_1.add(lbl_intro);
	con_2.add(list);
	con_4.add(btn_add);
	con_5.add(btn_remove);
	con_6.add(txtfield);
	frame.pack();
	frame.setVisible(true);

	//Close Option
	frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

//main method
public static void main(String[] args)
{
	ToDoList td = new ToDoList();
    td.setVisible(true);
}

//Click options
public void actionPerformed (ActionEvent e){
      
    if(e.getSource() == this.btn_add){
    	if (this.ToDoinput != ""){
			addToDo();
		}else{
			JOptionPane.showMessageDialog(null, "To add a task you have to write something in your textfield.");
		}
    }else if(e.getSource() == this.btn_remove){
        removeToDo();
    }
}

//method to add new todo option 
public static void addToDo(){
	
}

//method to remove todo option
public static void removeToDo(){
	
}

}


[IMG]http://forum.byte-welt.net/attachment.php?attachmentid=1950&d=1418905659[/IMG]

Konnte leider nur schnell rübergucken, muss gleich weg, versuch es mal in die Richtung:
frame.add(pnl_1);
vor das frame.pack(); zu setzen also hinter die anderen Zuweisungen.

Wenn es nicht hilft, dann warte eine andere Antwort ab, muss weg.

Ne hat leider nix geholfen, aber troztdem danke, ist irgendwie die erste Antwort seit Tagen in sämtlichen Foren …

Hallo Isabell,

versuche doch deine Komponenten nach und nach aufzubauen, also beginne erst mal mit einem Schalter auf einem Panel oder sogar auf dem Frame. Ich weiss jetzt nicht mehr genau, welche Funktion Components haben, aber vielleicht kannst du diese auch erst mal weglassen und die Verschachtelungen per Panels machen (mit allen Layouts).

Grusz
Falk

Du stellst Dir leider selbste ein Bein indem Du von JFrame erbst, dann aber doch eine neue Instanz von JFrame erzeugst, der Du dein HauptPanel übergibst.

bye
TT

der Button ist die componente ^^ und ja ich habe ja versucht 2 layouts zu kombinieren und wenn ich da nicht mehrere sachen auf einmal reinschreibe weiß ich ja nicht obs geklappt hat.

generell kann ich buttons und weiß ich nicht was alles darstellen lassen nur mit den layout klappts leider noch nicht

*** Edit ***

Timothy danke aber wie löse ich denn das? Wie gesagt Swing und ich sind nicht die besten Freunde :confused:

Der erste Schritt wäre extends JFrame wegzulassen.

Dann brauchst du eine Methode setVisible(boolean visible) in der du die Sichtbarkeit an den Frame weiterreichst.

Das löst aber das Problem noch nicht.

Generell solltest du dir nochmal die Benennung der Variablen anschauen, die entsprechen nicht dem Java-Standard (lowerCamelCase ohne Unterstriche).

*** Edit ***

Ein genereller Actionlistener ist auch unschön, das würde ich direkt an den Komponenten machen.

*** Edit ***

Container sind AWT, die sollte man nicht mit Swing mischen.

Nochmals danke, aber ich weiß immer noch nicht wie ichs jetzt machen soll… Kann mir keiner beim Code helfen

Ich hab den Code mal etwas weiter bearbeitet, allerdings kenne ich mich mit JLists nicht aus. Nach Recherche im Internet müsstest du wohl ein eigenes Modell verwenden, aber vielleicht ist das ein Anfang:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class ToDoList {

    private final JFrame frame;

    private final JButton addButton;
    private final JButton removeButton;
    private final JTextField textField;
    private final JList<String> todos;

    public ToDoList() {
        frame = createFrame();
        addButton = createAddButton();
        removeButton = createRemoveButton();
        textField = createTextInputField();
        todos = createTodoList();

        frame.add(createUpperPanel(), BorderLayout.PAGE_START);
        frame.add(createLeftPanel(), BorderLayout.LINE_START);
        frame.add(createCenterPanel(), BorderLayout.CENTER);
        frame.add(createLowerPanel(), BorderLayout.PAGE_END);

        frame.pack();
    }

    private JFrame createFrame() {
        JFrame frame = new JFrame();
        frame.setTitle("ToDo-List");
        frame.setLayout(new BorderLayout());
        frame.setPreferredSize(new Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        return frame;
    }

    private JButton createAddButton() {
        JButton btnAdd = new JButton(" + ");
        btnAdd.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addToDo();
            }
        });
        return btnAdd;
    }

    private JButton createRemoveButton() {
        JButton btnRemove = new JButton(" - ");
        btnRemove.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                removeToDo();
            }
        });
        return btnRemove;
    }

    private JTextField createTextInputField() {
        JTextField textField = new JTextField();
        textField.setCaretColor(Color.RED);
        return textField;
    }

    private JList<String> createTodoList() {
        JList<String> list = new JList<>();
        return list;
    }

    private JPanel createUpperPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        JLabel labelIntro = new JLabel("Below you can see your undone tasks. "
                + "To add or remove tasks use the plus and minus button "
                + "on the right.");
        panel.add(labelIntro, BorderLayout.PAGE_START);

        panel.add(textField, BorderLayout.CENTER);

        return panel;
    }

    private Component createLeftPanel() {
        return todos;
    }

    private Component createCenterPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        // TODO Auto-generated method stub
        return panel;
    }

    private Component createLowerPanel() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());

        panel.add(addButton, BorderLayout.LINE_START);
        panel.add(removeButton, BorderLayout.LINE_END);

        return panel;
    }

    private void setVisible(boolean visible) {
        frame.setVisible(visible);
    }

    public void addToDo() {
        String toDoInput = textField.getText();
        if (toDoInput.isEmpty()) {
            JOptionPane.showMessageDialog(null, "To add a task you have "
                    + "to write something in your textfield.");
        }
        else {
//            DefaultListModel<String> listModel =
//                    (DefaultListModel<String>) todos.getModel();
//            listModel.addElement(toDoInput);
        }
    }

    public void removeToDo() {
        // TODO ...
    }

    public static void main(String[] args) {
        ToDoList td = new ToDoList();
        td.setVisible(true);
    }

}```

Deine ganzen con... haben mich verwirrt. Wie du siehst, habe ich die Erstellung der Gui stark gestrafft und dafür einiges in eindeutig benannte Methoden ausgelagert. Dadurch wird das ganze übersichtlicher und leichter zu lesen, die Anordnung kann allerdings nun nicht mehr deinen Wünschen entsprechen. Das sollte sich ja aber nun leicht beheben lassen, da du wenigstens etwas siehst.

Ja das mit den Containern ist auch blöd aber da durch das ich es in der Berufsschule machen muss, wollte ich das einfach einbauen als Übung weil ich es ja so oder so brauche. Viel dank dir ehrlich, seit Tagen frage ich rum und keiner kriegt es auf die Reihe…
Also ich habs mal angeschaut, jetzt werden die Komponenten angezeigt aber nicht so wie ich es wollte :confused:

Immer noch stark verbesserungswürdig, aber du sollst deinen Code ja noch erkennen:

package gui;

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

import javax.swing.*;

public class ToDoList {
    private JList<String> list = new JList<>(new DefaultListModel<>());

    public ToDoList() {

        //Components
        final JTextField txtfield = new JTextField();
        JButton btn_add = new JButton(" + ");
        JButton btn_remove = new JButton(" - ");
        btn_add.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                 addToDo(txtfield.getText());
            }
        });
        btn_remove.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                removeToDo();
            }
        });
        JLabel lbl_intro = new JLabel("<html>Below you can see your undone tasks.<br> To add or remove tasks use the plus and minus button on the right.</html>");


        JFrame frame = new JFrame();
        frame.setTitle("ToDo-List");
        JPanel pnl_1 = new JPanel(new BorderLayout());
        Box box = Box.createHorizontalBox();
        box.add(btn_remove);
        box.add(btn_add);
        box.add(txtfield);

        //adds
        pnl_1.add(lbl_intro, BorderLayout.NORTH);
        pnl_1.add(new JScrollPane(list), BorderLayout.CENTER);
        pnl_1.add(box, BorderLayout.SOUTH);
        frame.add(pnl_1);
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    //main method
    public static void main(String[] args) {
        new ToDoList();
    }

    //method to add new todo option
    public void addToDo(String s) {
        ((DefaultListModel<String>)list.getModel()).addElement(s);

    }

    //method to remove todo option
    public void removeToDo() {
        int index = list.getSelectedIndex();
        if (index >= 0) {
            ((DefaultListModel<String>)list.getModel()).removeElementAt(index);
        }
    }
}

[Edit]

Oh, Crian war schneller…

sieht aber leider auch nicht so aus wie es soll :confused:

Es zeigt aber im Gegensatz zu deinem etwas an :stuck_out_tongue:

Kann doch nicht so schwer sein, die zwei Buttons zu verschieben. Wobei ich sie unten fast besser finde - nehmen weniger Platz weg, und das + ist näher am Eingabe. Alternativ könnte man bei + auch einen JOptionDialog hochpoppen lassen, wo man dann den String eingibt.

Du wartest jetzt allen ernstes darauf, dass jemand einen Code postet, der dann so aussieht, wie du es erwartest, statt in die geposteten Codes zu schauen und daraus zu lernen?

Nein alllen ernstes nicht, die ganzen Schlüsselbegrife wie Linestart stehen ja drinnen nur wirds nicht ausgeführt … und ich hab keine idee warums nicht geht

Du versuchst Swing zu Programmieren, verwendest aber “Container” was keine Swing Klasse ist. Verwende JPanel.