Welches Konzept wendet man an, wenn man GUIs sauber vom GUI-Code trennen will?
Beispiel:
Ich habe auf einem Frame einen Button und ein TextField. Wenn ich auf den Button klicke, soll der Text des TextFields ausgegeben werden; kann man das dann überhaupt mit sauberer GUI-Trennung vereinbaren?
Ich benötige:
Das könnte quasi so aussehen:
Wirklich geordnet ist das jetzt aber nicht und besonders wenn es mehrer Komponenten wären, würde die Übersicht schnell verloren gehen.
Frage 1:
Wie kann man es besser machen (muss kein Codebeispiel sein!)?
Frage 2:
Zur Kapselung: Wäre es besser, würde ich aus dem obigen Code Folgendes machen?
So habe ich den langen Konstruktor-Code gekapselt – aber ist das wirklich besser, und sollte ich noch mehr kapseln?
Danke für eure Antworten im Voraus; und sry für den langen Code
Beispiel:
Ich habe auf einem Frame einen Button und ein TextField. Wenn ich auf den Button klicke, soll der Text des TextFields ausgegeben werden; kann man das dann überhaupt mit sauberer GUI-Trennung vereinbaren?
Ich benötige:
- Eine Klasse, die einen ActionListener implementiert
- Eine Klasse mit einer actionPerformed-Methode
- Ein Frame, auf das ich Button und TextField (am besten als ein Panel) packe
Das könnte quasi so aussehen:
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class MyGUI
extends Frame
implements ActionListener
{
private Button textAusgabeButton; //Der Button, der den Text des TextFields ausgibt
private TextField eingabefeld; //Enthält den vom Button ausgegeben werdenden Text
private final static Color BACK_COLOR = new Color(220, 220, 220);
//MAIN-METHODE
public static void main(String[] args)
{
MyGUI wnd = new MyGUI();
}
/*Konstruktor */
public MyGUI()
{
//Initialisierung
super("GUI-Test #3"); //Erstellt das Raw-Fenster
setSize(330, 65);
setBackground(MyGUI.BACK_COLOR);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event)
{ System.exit(0); }});
setResizable(false);
Panel panel = new Panel(); //Layout-Vorlage
panel.setLayout(null); //Damit die Komponenten frei mit Koordinaten gesetzt werden können
//Komponenten erstellen
textAusgabeButton = new Button("Text ausgeben");
textAusgabeButton.setBounds(5, 5, 150, 30); //Erstellt auf 5|5 einen Button mit w = 50, h = 30
eingabefeld = new TextField("Irgendein Text");
eingabefeld.setBounds(160, 5, 150, 30);
//Komponenten Listener hinzufuegen und in das Panel einbinden
textAusgabeButton.addActionListener(this);
panel.add(textAusgabeButton);
eingabefeld.addActionListener(this);
panel.add(eingabefeld);
//Panel einbinden/auf das Fenster setzen
add(panel);
setVisible(true);
}
/* Wenn der Button geklickt wurde, wird der Text aus dem TextField
ausgegeben */
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == textAusgabeButton)
{
System.out.print(eingabefeld.getText());
}
}
}
Wirklich geordnet ist das jetzt aber nicht und besonders wenn es mehrer Komponenten wären, würde die Übersicht schnell verloren gehen.
Frage 1:
Wie kann man es besser machen (muss kein Codebeispiel sein!)?
Frage 2:
Zur Kapselung: Wäre es besser, würde ich aus dem obigen Code Folgendes machen?
Java:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class MyGUI
extends Frame
implements ActionListener
{
private Button textAusgabeButton; //Der Button, der den Text des TextFields ausgibt
private TextField eingabefeld; //Enthält den vom Button ausgegeben werdenden Text
private final static Color BACK_COLOR = new Color(240, 240, 240);
//MAIN-METHODE
public static void main(String[] args)
{
MyGUI wnd = new MyGUI();
}
/*Konstruktor */
public MyGUI()
{
//Inits
super("GUI-Test #3"); //Erstellt das Raw-Fenster
setSize(330, 65);
setVisible(true);
setBackground(MyGUI.BACK_COLOR);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent event)
{ System.exit(0); }});
setResizable(false);
createAndAddPanel(createComponents());
}
/* Wenn der Button geklickt wurde, wird der Text aus dem TextField
ausgegeben */
public void actionPerformed(ActionEvent event)
{
if (event.getSource() == textAusgabeButton)
{
System.out.print(eingabefeld.getText());
}
}
private Component[] createComponents()
{
//Komponenten erstellen
textAusgabeButton = new Button("Text ausgeben");
textAusgabeButton.setBounds(5, 5, 150, 30); //Erstellt auf 5|5 einen Button mit w = 50, h = 30
textAusgabeButton.addActionListener(this);
eingabefeld = new TextField("Irgendein Text");
eingabefeld.setBounds(160, 5, 150, 30);
eingabefeld.addActionListener(this);
Component[] comp = {textAusgabeButton, eingabefeld};
return comp;
}
private void createAndAddPanel(Component[] components)
{
Panel panel = new Panel(); //Layout-Vorlage
panel.setLayout(null); //Damit die Komponenten frei mit Koordinaten gesetzt werden können
for (int i = 0; i < components.length; i++)
{
panel.add(components[i]);
}
add(panel);
}
}
So habe ich den langen Konstruktor-Code gekapselt – aber ist das wirklich besser, und sollte ich noch mehr kapseln?
Danke für eure Antworten im Voraus; und sry für den langen Code
Zuletzt bearbeitet: