Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Also beim StringBuffer ist das klar warum das funktioniert. StringBuffer ist mit einer FluentAPI versehen und gibt immer wieder das Objekt nach einem Methodenaufruf zurück.
Dein JPanel-Bsp gibt es nicht. Es gibt keinen Konstruktor der gleich eine Component entgegen nimmt.
Die wichtigsten Beispiele für solche anonymen Objekte sind Toplevel Objekte, z.b. wenn man eine GUI startet, oder auch ActionListener (die wiederum auch gleich eine anonyme Klasse und dazu gleich eine anonyme Instanz hat).
Ausschnitt:
Java:
JButton btn = new JButton("Test me");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//...
}
});
Es heißt nicht das das Objekt das du erstellt hast verloren hast, sondern von wem anders gespeichert und verwendet wird (s.o. ActionListener).
Also kann man nicht einfach ein Objekt erstellen und dann die Methoden anhängen? Geht das nur bei StringBuffer?
Wieso geht das ausgerechnet bei Listenern? Und wie kann man dann nachträglich noch z.B auf den Button zugreifen wenn z.B im Konstruktor den Button übergebe ?
Man kann schon ein Objekt erstellen und dann eine Methode dranhängen, aber was dann zurückkommt hängt von der Methode ab.
Bsp.:
Java:
//Normale Verwendung
List<Integer> list = new ArrayList<Integer>();
list.add(1);
//Objekt erstellen und Methode dranhängen
boolean added = new ArrayList<Integer>().add(1);
Bei dem zweiten Bsp. erstellst du deine ArrayList und fügst dem gleich ein Element hinzu und dadurch wird dir ein boolean wegen der Methode zurückgegeben. Daher verlierst du die Referenz auf deine ArrayList und wird somit verschwinden. Das ist dann eine non-FluentAPI. Da musst du immer die Referenz auf das erstellte Objekt halten und die Methoden von dem Objekt aufrufen.
KSKB:
Java:
package fluent;
public class FluentAPITest {
public static void main(String[] args) {
// FluentAPI
System.out.println(new FluentAPI(0).add(1).add(3).minus(10).add(100).getValue());
// NonFluentAPI
NonFluentAPI nfa = new NonFluentAPI(0);
nfa.add(1);
nfa.add(3);
nfa.minus(10);
nfa.add(100);
System.out.println(nfa.getValue());
}
static class FluentAPI {
int value;
public FluentAPI(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public FluentAPI add(int value) {
this.value += value;
return this;
}
public FluentAPI minus(int value) {
this.value -= value;
return this;
}
}
static class NonFluentAPI {
int value;
public NonFluentAPI(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public void add(int value) {
this.value += value;
}
public void minus(int value) {
this.value -= value;
}
}
}
Es geht nicht nur bei Listener es geht überall. Warum brauchst du eine Referenz auf den Button? Der Button weiß ja im vorhinein schon was gemacht werden soll, wenn er gedrückt wird!
Java:
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class ButtonLogic {
public static void main(String[] args) {
new ButtonLogic();
}
public ButtonLogic() {
JFrame frame = new JFrame("ButtonLogic");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
JPanel rootPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 0));
JButton btnHello = new JButton("Hello");
btnHello.addActionListener(event -> JOptionPane.showMessageDialog(frame, "Hello"));
JButton btnInput = new JButton("Name input");
btnInput.addActionListener(event -> {
String name = JOptionPane.showInputDialog(frame, "What is your name?");
if (name != null) {
JOptionPane.showMessageDialog(frame, "Hello " + name);
}
});
rootPanel.add(btnHello);
rootPanel.add(btnInput);
frame.add(rootPanel);
frame.pack();
frame.setVisible(true);
}
}
(PS: Ich glaube auch du sollst dir noch einmal die Basics ansehen, dann wirst du das verstehen)