GUI Button Klasse in anderer Klasse einfügen

Jänö

Mitglied
Ich versuche gerade eine kleine GUI zu machen.
Da dabei einige buttons vorkommen wollte ich objektorientiert programmieren und eine seperate Klasse machen, bei der bereits die Größe des buttons festgelegt ist und die 2 Methoden hat, mit denen ich die Position und den Text ändern kann. Wenn ich jetzt in meiner Hauptklasse den button mit frame.add(Button1) hinzufügen will, geht das nicht, weil es ja eine ganze Klasse ist und nicht ein button, den ich in der selben klasse eingeführt habe.
Wie kann ich das trotzdem machen?

Button Klasse:
Java:
import javax.swing.JButton;

public class Button
{
   static JButton jb = new JButton();
   public static void main(String[] args)
   {
       jb.setSize(80, 80);
       jb.setVisible(true);
   }
   public void Text(String t)
   {
       jb.setText(t);
    }
   public void Position(int x, int y)
   {
       jb.setLocation(x,y);
    }
}

Haupt Klasse:
Java:
import javax.swing.JFrame;
public class Hauptklasse
{
    static JFrame frame = new JFrame();
    static Button button1 = new Button();
    
    public static void main(String[] args)
    {
        Frame();
        Button();
    }
    static void Frame()
    {
        frame.setVisible(true);
        frame.setBounds(300, 200, 100, 100);
        frame.setLayout(null);  
        frame.add(button1); //Hier ist der Fehler: "no suitable method found for add(Button)
    }
    static void Button()
    {
        button1.setVisible(true);
        button1.setBounds(10, 10, 50, 50);
    }
}
 
Du solltest dir noch mal Java Grundlagen angucken.

Namensgebung -> Falsch
Aufbau -> Falsch

Deine extra Klasse macht irgendwie auch keinen Sinn... Du musst ja so oder so die Methoden aufrufen und die Sachen eingeben. Ist so ja eher doppelt gemoppelt...
Wozu also eine neue anlegen ? Arbeit ersparst du dir ja nicht gerade dadurch.
Ich denke, eine einfache Methode in deiner "Hauptklasse", würde in deinem Fall reichen.

Und: du hast 2 mains - wtf ? :bahnhof:

Du wolltest doch sicher eher einen Konstruktor der Klasse machen, oder ?
 
Methoden immer lowerCamelCase schreiben...

Deine Klasse Button ist zwar ein Button - sonst wuerde er ja nicht so heissen, aber das wars auch schon.

Um ihn im Swing Kontext verwenden zu koennen sollte er JButton erweitern.

Java:
public class Button extends JButton
{

}

hier kannst du im Konstruktor die Werte setzen, die du dafuer haben moechtest.
entweder direkt im Standardkonstruktor oder einem eigens definierten.


Eine Main Funktion hat in dieser Klasse NICHTS zu suchen - weg damit


Java:
import javax.swing.JButton;
 
public class Button extends JButton
{
String text;
   public Button()
   {
       jb.setSize(80, 80);
       jb.setVisible(true);
   }
  
   public void setPosition(int x, int y)//kann man weglassen, da JButton schon setLocation anbietet
   {
       this.setLocation(x,y);
    }
}

die andere Klasse.

Java:
import javax.swing.JFrame;
public class Hauptklasse
{
    private JFrame frame;
    private Button button1;
    
    public static void main(String[] args)
    {
        erzeugeNeuenFrame();
        erzeugeNeuenButton("TextAufDemButton");
    }
    static void erzeugeNeuenFrame()
    {
        frame = new JFrame();
        frame.setVisible(true);
        frame.setBounds(300, 200, 100, 100);
        frame.setLayout(null);  
        frame.add(button1); //Hier ist der Fehler: "no suitable method found for add(Button)
    }
    static void erzeugeNeuenButton(String text)
    {
        button1 = new Button()
        button1.setVisible(true);
        button1.setText(text);
        button1.setBounds(10, 10, 50, 50);
    }
}
 
Zuletzt bearbeitet:
Cool Danke! 🙂
Genau das was ich gesucht habe.
Dass mit der doppelten main methode war nur ein versehn, da ich dass nur schnell als beispiel geschrieben habe und normal in BlueJ programmiere, da braucht man keine main. Ich hab nur die methoden mit mein ausgetauscht.
Und in der Hauptklasse muss es natürlich heißen
Java:
static void Button()
{
button1.Text("Text");
button1.Position(20, 20);
}

Aber das war ja zum Glück nicht ausschlaggebend.
Ich wollte nur, falls ich beim Button noch mehr Daten vorher festlegen will, das in einer extra Klasse machen, damit ich es nicht immer neu schreiben muss.
Außerdem sagt unser Lehrer wir sollen objektorientiert programmieren, auch wenn es fraglich ist, ob sich das jetzt lohnt oder nicht.
Danke für deine Antwort 🙂
 

Zurück
Oben