B
bienchen
Gast
Hallo zusammen,
also ich bin grade dabei java zu lernen und bin grade auf ein problem gestoßen, welches sich um die grundzüge der oop dreht. um das denkproblem das ich habe besser zu veranschaulichen poste ich euch mal meinen bisherigen code.
die fragen stelle ich am besten weiter unten.
Die Klasse Fenster
Die Klasse ShoutBox
also wie bereits gepostet hab ich einen frame (erster code) und einen panel (zweiter code). ich habe jetzt mal nur ein panel gepostet. die anderen panel wie z.b. infobox, controlbox etc aus der klasse fenster haben aehnlichen inhalt. nehmen wir an ich realisiere einen button in diesem shoutbox panel, z.b. eine nachricht über das netzwerk senden und zudem soll durch das drücken des buttons eine aktion in der klasse fenster z.b. ein label wird von "nachricht nicht gesendet" in "nachricht wurde gesendet" umgewandelt werden.
mein lsg wäre ich übergebe dem panel shoutbox im konstruktor eine this referenz der klasse fenster und ändere mit z.b. parentfenster.setlabelstring( "nachricht wurde gesendet." ) das label aus der klasse fenster (parentfenster ist die referenz auf die klasse fenster). bei dieser lsg müsste ich also noch eine methode z.b. setlabelstring( ... ) in der klasse fenster erzeugen.
mein nächster gedanke wäre ich wandle die klasse shoutbox in eine inner klasse von der klasse fenster und kann somit uneingeschränkt auf die methoden und variablen zugreifen.
das wäre jetzt mein erstes problem.
eine weiteres problem ist, das ich ja nun mehrere panels in dieser klasse fenster erzeugt habe. nehmen wir an durch das drücken eines button in der klasse shoutbox (panel) soll in der klasse infobox (ist auch ein panel) ebenfalls eine aktion ausgelöst werden (z.b. ein label soll sich ändern). wie greife ich nun aus der klasse shoutbox in die klasse infobox um das label zu ändern - ich habe keine referenz.
mein lsg zu dem problem ist das ich jeder panel klasse eine methode mit .initAllpanals( JPanel infobox, JPanel fehlerbox, JPanel shoutbox ) zur verfügung stelle, über der ich dann die entsprechenden referenzen auf die entsprechenden panel klassen übergebe.
allerdings weiss ich das das totaler quatsch is. schliesslich ist das java und nich irgendeine gehackte sprache.
mein 2te lsg wäre das ich die panels in der klasse fenster anders erzeuge. also anstatt eine eigene klasse von shoutbox zu machen schreib ich dann in die klasse fenster
durch die lsg hätte ich alle panels in der klasse fenster und könnte wenn ich zu einem actionlistener eine aktion hinzufüge z.b. andere jlabel ändern ohne irgendwelche referenzen zu übergeben. allerdings wüsste ich jetzt nich wie ich dann noch der klasse jpanel eigene methode hinzufügen kann.
Gibt es irgendwelche allgemeine lsg. habe viel von dem uml gehört, dass man erst planen soll und dann losprogrammiert, aber das hab ich auch noch nicht so raus. weiss einfach am anfang, wenn ich die idee habe etwas zu programmieren nicht welche klasse von welche abhängig sind und welche klasse von welcher eine referenz brauchen.
sollte man die oben beschriebenen probleme mit inneren klassen lösen oder kann man ruhig eigene klassen schreiben und mit extends JPanel erweitern oder sollte man lieber JPanel jpanel = new JPanel() nehmen und keine eigene klasse programmieren.
wann soll ich innere klassen nehmen, wann soll ich meine eigene klasse mit jpanel erweitern und wann soll ich einfach die api klasse jpanel nehmen, also jpanel = new jpanel();
ja das wäre es jetzt erstmal. hab reichlich geschrieben und ich hoffe die personen die helfen wollen bekommen kein nasenbluten wenn sie solche lsgen hoeren. ich hab mir gestern das buch analyse und design mit uml2 bestellt und versuche, wenn das buch da is sofort meine probleme zu beheben und eine entsprechende richtige lsg zu posten.
achso was ich auch noch fragen wollt ist warum die klasse unbedingt darauf drängt (muss man aber irgendwie nich) das ich eine automatisch generierte private static final long serialVersionUID = 1022680599771468799L; einfüge?
vielen dank katha
also ich bin grade dabei java zu lernen und bin grade auf ein problem gestoßen, welches sich um die grundzüge der oop dreht. um das denkproblem das ich habe besser zu veranschaulichen poste ich euch mal meinen bisherigen code.
die fragen stelle ich am besten weiter unten.
Die Klasse Fenster
Code:
public class Fenster extends JFrame {
public Fenster() {
toolkit1 = Toolkit.getDefaultToolkit();
Image img = toolkit1.getImage( "c://dame.jpg" );
this.setResizable( false );
this.setSize( 800, 600 );
this.setLocation( 10, 5 );
this.setIconImage( img );
this.setTitle( "Dame - Spielstart" );
battlepanel = new BattlePanel();
mainpanel = new JPanel();
mainpanel.setPreferredSize( new Dimension( 250, 400 ) );
shoutbox = new ShoutBox();
infobox = new InfoBox();
fehlerbox = new FehlerBox();
controlbox = new ControlBox();
mainpanel.add( shoutbox );
mainpanel.add( infobox);
mainpanel.add( fehlerbox );
mainpanel.add( controlbox );
this.add( battlepanel, BorderLayout.CENTER );
this.add( mainpanel, BorderLayout.EAST );
}
private Toolkit toolkit1;
private JPanel shoutbox, controlbox, mainpanel, infobox, battlepanel, fehlerbox;
private static final long serialVersionUID = -3853732973302441381L;
}
Die Klasse ShoutBox
Code:
public class ShoutBox extends JPanel {
public ShoutBox() {
/* Paneleinstellungen - Farbe und Größe */
this.setPreferredSize( new Dimension( 250, 245 ) );
this.setToolTipText( "Spielerchat." );
/* Ein Rahmen wird dem Panel hinzugefügt */
Border etched = BorderFactory.createEtchedBorder();
Border titled = BorderFactory.createTitledBorder( etched, " Shoutbox ");
this.setBorder( titled );
/* TextArea für die eingegebenen und erhaltenen Nachrichten */
textarea = new JTextArea( 8, 20 );
textarea.setEditable( false );
textarea.setLineWrap( true );
scrollpane = new JScrollPane( textarea );
/* Textfeld für die Chateingaben */
textfield = new JTextField( 20 );
/* Button Panel, der Senden und Löschen Button enthält */
JPanel buttonpanel = new JPanel( new GridLayout( 2, 0 ) );
buttonpanel.setPreferredSize( new Dimension( 222, 38 ) );
sendbutton = new JButton( "Senden" );
sendbutton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
String text = textfield.getText();
if( !text.equals( "" ) ) {
textfield.setText( "" );
textarea.append( playername + ": " + text + "\n" );
}
}
});
clearbutton = new JButton( "Löschen" );
clearbutton.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
String text = textfield.getText();
if( !text.equals( "" ) ) {
textfield.setText( "" );
}
}
});
buttonpanel.add( sendbutton );
buttonpanel.add( clearbutton );
/* Komponenten dem Panel hinzufügen */
this.add( scrollpane );
this.add( textfield );
this.add( buttonpanel );
}
private JTextField textfield;
private JTextArea textarea;
private JButton sendbutton, clearbutton;
private JScrollPane scrollpane;
private String playername;
private static final long serialVersionUID = 1022680599771468799L;
}
also wie bereits gepostet hab ich einen frame (erster code) und einen panel (zweiter code). ich habe jetzt mal nur ein panel gepostet. die anderen panel wie z.b. infobox, controlbox etc aus der klasse fenster haben aehnlichen inhalt. nehmen wir an ich realisiere einen button in diesem shoutbox panel, z.b. eine nachricht über das netzwerk senden und zudem soll durch das drücken des buttons eine aktion in der klasse fenster z.b. ein label wird von "nachricht nicht gesendet" in "nachricht wurde gesendet" umgewandelt werden.
mein lsg wäre ich übergebe dem panel shoutbox im konstruktor eine this referenz der klasse fenster und ändere mit z.b. parentfenster.setlabelstring( "nachricht wurde gesendet." ) das label aus der klasse fenster (parentfenster ist die referenz auf die klasse fenster). bei dieser lsg müsste ich also noch eine methode z.b. setlabelstring( ... ) in der klasse fenster erzeugen.
mein nächster gedanke wäre ich wandle die klasse shoutbox in eine inner klasse von der klasse fenster und kann somit uneingeschränkt auf die methoden und variablen zugreifen.
das wäre jetzt mein erstes problem.
eine weiteres problem ist, das ich ja nun mehrere panels in dieser klasse fenster erzeugt habe. nehmen wir an durch das drücken eines button in der klasse shoutbox (panel) soll in der klasse infobox (ist auch ein panel) ebenfalls eine aktion ausgelöst werden (z.b. ein label soll sich ändern). wie greife ich nun aus der klasse shoutbox in die klasse infobox um das label zu ändern - ich habe keine referenz.
mein lsg zu dem problem ist das ich jeder panel klasse eine methode mit .initAllpanals( JPanel infobox, JPanel fehlerbox, JPanel shoutbox ) zur verfügung stelle, über der ich dann die entsprechenden referenzen auf die entsprechenden panel klassen übergebe.
allerdings weiss ich das das totaler quatsch is. schliesslich ist das java und nich irgendeine gehackte sprache.
mein 2te lsg wäre das ich die panels in der klasse fenster anders erzeuge. also anstatt eine eigene klasse von shoutbox zu machen schreib ich dann in die klasse fenster
Code:
JPanel shoutbox = new JPanel();
shoutbox.setPreferredSize( new Dimension( 250, 245 ) );
// also quasi der inhalt von der klasse shoutbox hier hin
shoutbox.add( button );
durch die lsg hätte ich alle panels in der klasse fenster und könnte wenn ich zu einem actionlistener eine aktion hinzufüge z.b. andere jlabel ändern ohne irgendwelche referenzen zu übergeben. allerdings wüsste ich jetzt nich wie ich dann noch der klasse jpanel eigene methode hinzufügen kann.
Gibt es irgendwelche allgemeine lsg. habe viel von dem uml gehört, dass man erst planen soll und dann losprogrammiert, aber das hab ich auch noch nicht so raus. weiss einfach am anfang, wenn ich die idee habe etwas zu programmieren nicht welche klasse von welche abhängig sind und welche klasse von welcher eine referenz brauchen.
sollte man die oben beschriebenen probleme mit inneren klassen lösen oder kann man ruhig eigene klassen schreiben und mit extends JPanel erweitern oder sollte man lieber JPanel jpanel = new JPanel() nehmen und keine eigene klasse programmieren.
wann soll ich innere klassen nehmen, wann soll ich meine eigene klasse mit jpanel erweitern und wann soll ich einfach die api klasse jpanel nehmen, also jpanel = new jpanel();
ja das wäre es jetzt erstmal. hab reichlich geschrieben und ich hoffe die personen die helfen wollen bekommen kein nasenbluten wenn sie solche lsgen hoeren. ich hab mir gestern das buch analyse und design mit uml2 bestellt und versuche, wenn das buch da is sofort meine probleme zu beheben und eine entsprechende richtige lsg zu posten.
achso was ich auch noch fragen wollt ist warum die klasse unbedingt darauf drängt (muss man aber irgendwie nich) das ich eine automatisch generierte private static final long serialVersionUID = 1022680599771468799L; einfüge?
vielen dank katha