Graphics in normaler Klasse

numpad

Mitglied
Hey,
ich bin gerade dabei, ein kleines Spiel zum üben und lernen zu programmieren, stehe jetzt dennoch (wieder) vor einer Hürde, nämlich will ich einen kleinen Nachrichtendialog anzeigen, welchen ich aber selber programmieren will, heißt nicht den standartdialog, sondern einen mit eigenen Graphics usw.

Ich rufe diesen Dialog über meine "Window"-Class auf, welche so ausieht:
Java:
public class Window {
	
	public Window(){
		
	}
	
	public void showMessage(String text){
		
	}
}
Ja, noch ziemlich mickrig.
Mein Problem besteht darin, dass ich über die "showMessage"-Methode ein Rectangle auf dem Bildschirm zeichnen will.
Das klappt aber nicht, da es nicht über meine "paintComponent()"-Methode in der Hauptklasse aufgerufen wird.

Meine Frage:
Wie kann ich ein einfaches Rectangle über die showMessage-Klasse malen?
Eher gesagt, wie definiere ich hier ein Graphics bzw. Graphics2D Objekt, sodass ich gant einfach
Java:
g.fillRect(50,50,200,200);
anwenden kann?
 
F

Firephoenix

Gast
Das Graphics-Objekt bekommst du von AWT oder Swing, du musst also eine entsprechende Komponente verwenden (z.B. ein JFrame das angezeigt wird), selbst wird es nicht erstellt.
 

Marco13

Top Contributor
Man KÖNNTE das Graphics VON der paintComponent-Methode deiner "Hauptklasse" an diese Methode weiterreichen
Java:
private MessageWindow currentWindow = ... // (der Name "Window" ist schon belegt...)

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (currentMessageWindow != null)
    { 
        currentMessageWindow.paintSometingInto(g);
    }

}
Kann aber hakelig werden, wenn man das als "Konzept" in größerem Rahmen umsetzen will. Beschreib' vielleicht mal genauer, worum's geht...
 
S

Spacerat

Gast
Andere Methode: Du erstellst dir ein BufferedImage in gewünschter Grösse und rufst darauf "createGraphics()" auf.
Aber warum der ganze Umstand? Wenn du etwas darstellen willst, kommst du an den Swing, AWT oder SWT ohnehin nicht vorbei.
 
F

Firephoenix

Gast
Hab zwar schon ne ganze Weile kein Swing mehr angefasst, aber hier wäre mal ein kleines Beispiel mit einem Dialog bei dem du selbst zeichnen kannst und der dir ein Datenmodell manipuliert
(ein Nachteil von der Variante ist meiner Meinung aber, das man ein Objekt manipuliert das als Parameter übergeben wird (MyData), dafür könnte man aber ähnlich wie bei der JOptionPane eine Methode einrichten die ein Antwort-Objekt zurückgibt das die gesetzten Felder enthält und solange den Thread blockiert (denke ich zu kompliziert? Das ist dann wohl eher was für die Leute hier die besser Swing beherrschen als ich :rtfm: )

Hier mal mein kleines Beispiel:

Java:
public class MyData {

	//Main zum ausführen
	public static void main(String[] args) {
		MyData data = new MyData();
		new MyDialog(data);
	}
	
	private String anyString;
	
	private int anyInt;

	public String getAnyString() {
		return anyString;
	}

	public void setAnyString(String anyString) {
		this.anyString = anyString;
	}

	public int getAnyInt() {
		return anyInt;
	}

	public void setAnyInt(int anyInt) {
		this.anyInt = anyInt;
	}
	
	@Override
	public String toString(){
		return anyString+" - "+anyInt;
	}
}

Java:
@SuppressWarnings("serial")
public class MyDialog extends JDialog {

	private JTextField intInput;
	private JTextField stringInput;
	private JButton okButton;
	private JButton cancelButton;

	private MyData data;

	public MyDialog(MyData data) {
		this.data = data;
		Container cp = new MyConentPane();
		cp.setLayout(new GridLayout(3, 2, 5, 5));
		cp.add(new JLabel("int eingeben"));
		cp.add(new JLabel("String eingeben"));
		intInput = new JTextField();
		intInput.setDocument(new IntegerDocument());
		cp.add(intInput);
		stringInput = new JTextField();
		cp.add(stringInput);
		okButton = new JButton("ok");
		okButton.addActionListener(new OkListener());
		cp.add(okButton);
		cancelButton = new JButton("cancel");
		cancelButton.addActionListener(new CancelListener());
		cp.add(cancelButton);
		setContentPane(cp);
		pack();
		setVisible(true);
	}

	private class MyConentPane extends JPanel {
		@Override
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.setColor(Color.PINK);
			g.fillRect(0, 0, getWidth(), getHeight());
		}
	}

	private class OkListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			data.setAnyInt(Integer.parseInt(intInput.getText()));
			data.setAnyString(stringInput.getText());
			closeDialogAndPrintData();
		}

	}

	private void closeDialogAndPrintData() {
		setVisible(false);
		dispose();
		System.out.println(data.toString());
	}

	private class CancelListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			closeDialogAndPrintData();
		}

	}

	@SuppressWarnings("serial")
	public class IntegerDocument extends PlainDocument {
		public void insertString(int offset, String s, AttributeSet attributeSet)
				throws BadLocationException {
			if (s.matches("\\d+")) {
				super.insertString(offset, s, attributeSet);
			}
		}
	}
}

Gruß
 

numpad

Mitglied
Man KÖNNTE das Graphics VON der paintComponent-Methode deiner "Hauptklasse" an diese Methode weiterreichen
Java:
private MessageWindow currentWindow = ... // (der Name "Window" ist schon belegt...)

@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (currentMessageWindow != null)
    { 
        currentMessageWindow.paintSometingInto(g);
    }

}
Kann aber hakelig werden, wenn man das als "Konzept" in größerem Rahmen umsetzen will. Beschreib' vielleicht mal genauer, worum's geht...

Ich möchte es so haben, dass ich einfach "new MessageWindow(text);" aufrufen kann, ohne dass ich irgendwas in der Hauptklasse in der methode "paintComponent" überprüfen muss, sprich eine eigene MessageBox.
 

pro2

Bekanntes Mitglied
Darf ich mal fragen, weshalb du das Rad neu erfinden willst?
Was du willst, ist ja quasi komplett neue Klassen erstellen, die die bestehenden Swingklassen ersetzen.
 
S

Spacerat

Gast
Darf ich mal fragen, weshalb du das Rad neu erfinden willst?
Was du willst, ist ja quasi komplett neue Klassen erstellen, die die bestehenden Swingklassen ersetzen.
Na und? Ist das so verwerflich? Warum denkst du gibt es SWT, JavaFX, entsprechendes Zeugs von Android usw.? Das "Rad" Swing war anscheinend nicht rund genug, von AWT ganz zu schweigen.
Das betrifft meiner Meinung nach nicht nur Window-/Widget-Toolkits. Das ist die "Jeder macht's anders"-Norm und jeder macht's dabei auch noch am besten, zumindest aus seiner Sicht.
[OT]Darüber hatte ich schon heftige Diskussion mit SirWayne und er bewies mir, dass Swing durch JavaFX ersetzt werden soll (wird wohl 'ne ähnliche Geschichte, wie zuvor mit AWT und Swing, nur das diesmal Swing abgelöst werden soll). Aber bitte, was soll dass denn? Man soll das Rad nicht neu erfinden? Wie kommen dann X verschiedene Räder zu Stande, die sich auch noch gegenseitig den Rang ablaufen?
So gesehen:
1. AWT war möglicherweise ein "Reinfall", gut.
2. Swing war wohl dann mehr oder minder eine Schlussfolgerung aus obigem Reinfall? Warum gibt's dann SWT?
3. Erzählt mir blos nicht, JavaFX würde SWT und Swing miteinander vereinen. Welche Existenzberechtigung hätte JavaFX sonst, wenn es sich anmaßt, Swing ersetzen zu können?
4. Alle anderen Window-/Widget-Toolkits sollte man besser meiden.
5. Ein Rad wurde zumindest noch nicht erfunden; Jenes, welches standardmässig auf jeder Plattform verfügbar ist. Evtl. sollte man mal daran arbeiten.[/OT]
 

pro2

Bekanntes Mitglied
Na und? Ist das so verwerflich? Warum denkst du gibt es SWT, JavaFX, entsprechendes Zeugs von Android usw.? Das "Rad" Swing war anscheinend nicht rund genug, von AWT ganz zu schweigen.
Das betrifft meiner Meinung nach nicht nur Window-/Widget-Toolkits. Das ist die "Jeder macht's anders"-Norm und jeder macht's dabei auch noch am besten, zumindest aus seiner Sicht.

Vielleicht war meine Frage etwas missverständlich ausgedrückt. Ich frage einfach nur nach den Beweggründen, um zu erfahren, ob er es a) aus dem Grund macht, dass er es besser / selber machen möchte, als es im Original ist oder ob er b) es machen möchte, weil er ein Problem mit den bestehenden Klassen hat, das sich vielleicht auch einfacher lösen lässt.
 
S

Spacerat

Gast
Also dass das einfacher geht, weiss man doch:
Java:
public class SimpleMessage extends JDialog {
  private final JTextArea message = new JTextArea();

  public SimpleMessage(String message) {
    this(message, false);
  }

  public SimpleMessage(String message, boolean modal) {
    super(null, "SimpleMessage", modal);
    add(this.message);
    setMessage(message);
  }

  public void setMessage(String message) {
    if(message == null) {
      throw new NullPointerException();
    }
    this.message.setText(message);
  }

  public void setVisible(boolean flag) {
    if(flag) {
      pack();
    }
    super.setVisible(flag);
  }
}
... und als nächstes macht man sich dann noch Gedanken um Abbruch- und OK-Buttons, denn diese fehlen noch.
 

bERt0r

Top Contributor
Oder JOptionPane
Java:
class MyPanel extends JPanel
{
@Override
public void paintComponent(){...}
}
JOptionPane.showMessageDialog(parent,new MyPanel());
 
S

Spacerat

Gast
Oder JOptionPane
Java:
class MyPanel extends JPanel
{
@Override
public void paintComponent(){...}
}
JOptionPane.showMessageDialog(parent,new MyPanel());
:eek: :oops:
Okay, evtl. fragt man ja auch, weil man nicht weiss, dass es doch noch viel einfacher geht. Wie war das mit dem Wald und den Bäumen?
Mich beschleicht aber das Gefühl, dass wir vom Thema abschweifen. Der TO wollte ja ein Graphics-Kontext in einer eigenen Klasse, was aber eigentlich nur Sinn macht, wenn man nicht mit Swing oder AWT hantiert (ob es bei SWT auch mit Graphics geht, enzieht sich meiner Kenntnis). In diesem Fall bliebe einem nur das BufferedImage oder in OpenGL eines der vielen Direct-Versionen, welche man in diesem Forum ebenfalls zu Häuf findet.
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JButton Konflikt mit Graphics Allgemeine Java-Themen 14
M Hässliche Schrift auf Graphics durch deriveFont Allgemeine Java-Themen 0
M String automatisch in nächste Zeile umbrechen (Graphics) Allgemeine Java-Themen 6
T Methoden Swing/Graphics/draw Allgemeine Java-Themen 6
B itext Graphics Allgemeine Java-Themen 4
N Graphics in Java Allgemeine Java-Themen 15
P Class Casting: Graphics/Graphics2D Allgemeine Java-Themen 7
G Graphics 2D Allgemeine Java-Themen 6
E FontMetrics ohne Graphics-Objekt Allgemeine Java-Themen 5
S Graphics! drawstring Allgemeine Java-Themen 4
C Graphics verschwinden Allgemeine Java-Themen 8
T Graphics 2D + Pfeil Allgemeine Java-Themen 2
J Unterschiede zwischen normaler und Debug Ausfuehrung? Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben