Methodenaufrufe verketten

Kenan89

Bekanntes Mitglied
Hallo,
wie kann man in Java Befehle verketten. Zum Beispiel:
Java:
Panelxy.add(new JLabel("test")).setBounds(5,5,5,5).setForeground(Color.white)...;

Wenn ich neben setBounds noch setForeground hinzufüge kriege ich ein Fehler von Eclipse.

Danke für Antworten im voraus.
 
Zuletzt bearbeitet von einem Moderator:
T

Tomate_Salat

Gast
1. zum titel: in einem Java-forum geht es generell um Java-Fragen. Bitte in Zukunft einen Titel wählen, der das Problem beschreibt
2. Soetwas geht nur, wenn die zuvoraufgerufene Methode auch das eigene Objekt zurückliefert. Insofern ist das hier nicht möglich.
 

eRaaaa

Top Contributor
Wenn die entsprechende Methode nichts zurückliefert, kannst du dann auch nichts verketten :D Das würde gehen wenn die Methode das Objekt zurückliefern würde (Builder Pattern)
 

Kenan89

Bekanntes Mitglied
eine neue frage: wie kann ich ein Bild in ein Panel einfügen. Direkt geht das ja mit add nicht. Mein Code schaut so aus:

Java:
import javax.swing.*;

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

import java.awt.Graphics;
import java.awt.Graphics2D;

public class Begin {
	
	JFrame frame = new JFrame("Startfenster");
	JPanel flaeche = new JPanel();
	
	public Begin(){
		frame.setSize(500,500);
		frame.setVisible(true);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.add(flaeche);
		flaeche.setBackground(Color.white);
		flaeche.setLayout(null);
	
	}

	public void paint(Graphics g){
		Image pic = Toolkit.getDefaultToolkit().getImage( "picture.png" );
		g.drawImage(pic, 0, 0,  flaeche);
	}
}

Ich denke ich muss irgendwie im Konstruktor die methode paint rufen. Nur was gebe ich als Parameter an? Denn die methode erwartet Graphics. Aber wahrscheinlich ist mein Lösungsansatz falsch.
 
B

bygones

Gast
mach dir ein JLabel, das kann ein Icon (ImageIcon zb) anzeigen. -> schau dir die Klasse JLabel an
 
G

Gast2

Gast
Du nutzt Swing, musst also die paintComponent() überschreiben. Und die Methode muss du nicht selbst aufrufen, das macht Swing für dich.
Allerdings musst du die paintComponent() Methode von einer JComponent überschreiben. Siehe dazu auch das Tutorial hier im Forum.
 

Kenan89

Bekanntes Mitglied
Mein neuer Code:

Java:
import javax.swing.JComponent;
import javax.swing.*;
 
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import java.awt.Graphics;
import java.awt.Graphics2D;

 
public class uebung {
    
    JFrame frame = new JFrame("Startfenster");
    JPanel flaeche = new JPanel();
    
    public static void main(String[] args){
    	new uebung();
    }
    
    public uebung(){
        frame.setSize(500,500);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(flaeche);
        flaeche.setBackground(Color.white);
        flaeche.setLayout(null);
    
    }
 
    public void paintComponent(Graphics g){
    	Graphics2D g2D = (Graphics2D) g;
        Image pic = Toolkit.getDefaultToolkit().getImage( "picture.png" );
        g.drawImage(pic, 50, 20,  flaeche);
    }
}

Klappt leider nicht. Ich kann das Bild nicht sehen, wenn ich das Programm starte.
Das mit dem Icon kann ich nicht machen, da ich später dieses Bild durch die Pfeiltasten bewegen möchte. Soll ein kleines Game werden.
 

hdi

Top Contributor
Um nochmal zur ursprünglichen Frage zurückzukommen (@TO bitte erstelle für voneinander völlig unabhängige Fragen jeweils ein eigenes Topic):

Du kannst dir das durchaus zusammenschustern. Und zwar in dem du eine eigene Klasse schreibst, die die eigentlichen Daten (JLabel) wrappt und alle für dich nötigen Methoden selbst implementiert (nach dem Delegate Pattern). Dann kannst du das auch verketten.

Java:
public class QuickCodeSupportingJLabel{
   // ...weil mir kein behinderterer Name eingefallen ist :D

  private final JLabel label;

  public QuickCodeSupportingJLabel(JLabel label){
      this.label = label;
  }

  public QuickCodeSupportingJLabel setBounds(int x, int y, int w, int h){
      label.setBounds(x,y,w,h); // "delegation"
      return this;
  }

  public QuickCodeSupportingJLabel setBackground(Color background){
      label.setBackground(background);
      return this;
  }
}

Java:
new QuickCodeSupporintLabel(new JLabel()).setBounds(10,10,100,30).setBackground(Color.RED));


Man kann sich natürlich Fragen wie sinnvoll dieser konkrete Anwendungsfall ist. Und man könnte das beantworten mit "Nicht sehr" ;)
 
Zuletzt bearbeitet:
G

Gast2

Gast
// ...weil mir kein behinderterer Name eingefallen ist :D
JLabelBuilder? ;)

Dir fehlt dann auch noch die Methode die dir dann das gebaute JLabel zurückgibt:
Java:
public JLabel build() {
  // ... evtl. nen paar Validierungen, sind alle Werte gesetzt?
  return label;
}
 

hdi

Top Contributor
Dir fehlt dann auch noch die Methode die dir dann das gebaute JLabel zurückgibt
Right, wenn man's dann adden will natürlich schon. Soweit hab ich nicht gedacht, ich wollt nur zeigen dass man halt generell alles in ner eigenen Klasse mit eigenen Methoden wrappen kann. Aber danke für die Ergänzung, für diesen Fall wärs natürlich sinnlos wenn man nicht ans Label kommt.
 

Kenan89

Bekanntes Mitglied
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import java.io.*;

public class StartScreen {
	public static void main(String[] args){
		new StartScreen();
	}
	
	JFrame Screen = new JFrame("Fenster");
        JPanel panel = new JPanel();
	public StartScreen(){
		Screen.setSize(800,800);
		Screen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Screen.setLocationRelativeTo(null);
		Screen.setVisible(true);
                Panel.setLayout(null);
                Panel.setBounds(0,0,50,100);
		Screen.add(Panel);
		BufferedImage img = null;
		try {
		    img = ImageIO.read(new File("./picture.png"));
		} catch (IOException e) {}
		
	}
}

Das Bild picture.png befindet sich im gleichen Ordner in workspace wie StartScreen.java. Von daher sollte es keine Probleme mit dem Auffinden des Bilder geben.
Meine Frage ist, wie ich dieses Bild in den Panel kriege, aber ohne JLabel und Icon. Das Bild soll dann später per Tastatur seine Position ändern können.
 
G

Gast2

Gast
Java:
        try {
            img = ImageIO.read(new File("./picture.png"));
        } catch (IOException e) {}
Von daher sollte es keine Probleme mit dem Auffinden des Bilder geben.
Ist aber nur geraten von dir... Niemals nie nicht Exceptions unter den Tisch fallen lassen. Niemals!!

Meine Frage ist, wie ich dieses Bild in den Panel kriege, aber ohne JLabel und Icon. Das Bild soll dann später per Tastatur seine Position ändern können.
Wenn du nicht das fertige JLabel nutzen willst, dann musst du dir selbst ne Komponente schreiben.
 
B

bygones

Gast
ausserdem solltest du zuerst alle componenten hinzufuegen und dann erst den Frame an sich auf visible setzen.

Und denk dran, wenn du selbst die Bounds setzt, also keinen Layoutmanager bzw Jlabel etc nutzen willst, du selbst dafuer sorgen musst, dass die componenten gross genug fuer dein Bild sind.... wenn du das dir aufhalsen willst...
 

Kenan89

Bekanntes Mitglied
Ich könnte eine eigene Klasse namens, z.b. componentexy erstellen. Dann einfach die Componente dem Panel hinzufügen. Aber ich will nciht für jedes Bild eine Componente schreiben. Wenn ich jetzt ein Bild anzeigen lassen will, brauche ich den Befehl graficxy.drawImage(...). So aber um diesen Befehl ausführen zu können, muss ich von JComponent erben. Es müsste doch auch möglich sein drawImage ohne Vererbung auszuführen?
 

Kenan89

Bekanntes Mitglied
@Eike
Das heisst ich muss immer mindestens eine Klasse neben der main-Klasse mit JComponent definieren. Habe ich das richtig verstanden?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
S Java Methodenaufrufe zählen Java Basics - Anfänger-Themen 4
M Methodenaufrufe im Konstruktoren Java Basics - Anfänger-Themen 31
M Lange Methodenaufrufe == suboptimales Klassendesign? Java Basics - Anfänger-Themen 5
D Wie baue ich sinnvoll eine Klasse, genauer die Methodenaufrufe auf? Java Basics - Anfänger-Themen 4
E Methoden Methodenaufrufe zählen Java Basics - Anfänger-Themen 11
D Interfaces und allgemeingültige Methodenaufrufe Java Basics - Anfänger-Themen 6
A Methodenaufrufe von Anonymen Klassen Java Basics - Anfänger-Themen 6
H Methodenaufrufe protokollieren Java Basics - Anfänger-Themen 7
T Methodenaufrufe zählen Java Basics - Anfänger-Themen 24
R Methodenaufrufe Java Basics - Anfänger-Themen 15
L Methodenaufrufe Protokollieren Java Basics - Anfänger-Themen 5
G Methodenaufrufe funktionieren nicht Java Basics - Anfänger-Themen 2
L Reihenfolge der Methodenaufrufe Java Basics - Anfänger-Themen 6
P Verketten, Aneinanderreihen von Strings Java Basics - Anfänger-Themen 2
M Verketten von Formularfelder im PDF-Formular Java Basics - Anfänger-Themen 0
P Java Verketten von Stream - Bedeutung der Anweisungen? Java Basics - Anfänger-Themen 3
Syncopated Pandemonium Verketten von Strings funktioniert nicht Java Basics - Anfänger-Themen 4
O Variablennamen verketten Java Basics - Anfänger-Themen 16
N Strings verketten Java Basics - Anfänger-Themen 3
S Konstruktoren verketten Java Basics - Anfänger-Themen 6
Developer_X jede Zeile einer Datei mit einem String verketten Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben