JButton über benutzerdefinierte paintComponent setzen

Niky

Mitglied
Hi, ich schreibe ein Spiel und zeichne deswegen alles "selbst" in der paintComponent. Ich möchte trotzdem Buttons benutzen. Jetzt möchte ich aber nicht jedes Mal die Buttons hinzufügen müssen (d.h. nicht jeden Schleifendurchlauf). Die canvas-Methode ist sozusagen meine Zeichenmethode. Hat Gründe, warum das nicht direkt in der paintComponent-Methode ist, denkt sie euch einfach wie die paintComponent.

Java:
package modules.menu;

import java.awt.Color;
import java.awt.Font;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.util.ArrayList;

import javax.swing.JButton;

import engine.GUI;

public class MenuGUI extends GUI {
   public MenuGUI() {
     super(900, 600);
   }

   private static final long serialVersionUID = 1L;

   @Override
   public void canvas() {
     Rectangle bounds = g.getDeviceConfiguration().getBounds();

     g.setColor(Color.WHITE);
     g.setFont(new Font("Adobe Arabic", Font.PLAIN, 20));
     g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

     ArrayList<String> text = new ArrayList<String>();

     text.add("AAA");
     text.add("BB");
     text.add("C");
     text.add("C");
     text.add("BB");
     text.add("AAA");
     text.add("AAA");

     // adjust if necessary
     final int param1 = 30;
     final int param2 = -14;

     for (int i = 0; i < text.size(); i++) {
       g.drawString(text.get(i), bounds.width / 2 - g.getFontMetrics().stringWidth(text.get(i)) / 2, param2
           + bounds.height / 2 + (bounds.height / 2 - param1 * text.size()) * (i - (text.size() / 2)) + 25);
     }
    
// hier füge ich den Button hinzu, nur unnötigerweise jeden Schleifendurchlauf . . .
     JButton j = new JButton();
     j.setBounds(0, 0, 500, 500);
     j.addActionListener(inputManager);
     add(j);
   }
}
 

VfL_Freak

Top Contributor
Moin,

irgendwie verstehe ich nicht so ganz, was Du willst!
Jetzt möchte ich aber nicht jedes Mal die Buttons hinzufügen müssen (d.h. nicht jeden Schleifendurchlauf)
Machst Du ja auch nicht, da der Block NACH der for-Schleife steht!
Es sein denn, das "canvas()" würde innerhalb einer Schleife aufgerufen ....
Kann aber ohne den entsprechenden Code keiner beurteilen!

Beschreibe ggf. nochmal genau, was Dein Problem ist !

Gruß Klaus
 

Niky

Mitglied
Moin,

irgendwie verstehe ich nicht so ganz, was Du willst!

Machst Du ja auch nicht, da der Block NACH der for-Schleife steht!
Es sein denn, das "canvas()" würde innerhalb einer Schleife aufgerufen ....
Kann aber ohne den entsprechenden Code keiner beurteilen!

Beschreibe ggf. nochmal genau, was Dein Problem ist !

Gruß Klaus

Danke für deine Antwort. Richtig, canvas() wird innerhalb einer Schleife aufgerufen.

Die Loop sagt dem StateManager, er soll den jetzigen State (das Module) rendern:
Java:
package engine;

class Loop implements Runnable {
   private StateManager stateManager;

   public static final int FPS = 60;
   public static final double targetTime = 1d / ((double) FPS * 1_000);

   public Loop(StateManager stateManager) {
     this.stateManager = stateManager;
   }

   @Override
   public void run() {
     // TODO change to use fixed time step

     double time0, time1, time2;
     time0 = System.currentTimeMillis();
     time1 = 0;
     time2 = System.currentTimeMillis();

     while (true) {
       stateManager.processUserInput();
       stateManager.update(System.currentTimeMillis() - time2);
       time2 = System.currentTimeMillis();

       time1 += System.currentTimeMillis() - time0;
       if (time0 - time1 >= targetTime) {
         stateManager.render();
         time0 = System.currentTimeMillis();
         time1 = 0;
       }
     }
   }
}

Der StateManager sagt der GUI des Modules, es soll die canvas()-Methode und schließlich die repaint()-Methode aufgerufen werden.
Java:
package engine;

import java.util.Stack;

class StateManager {
   private Stack<Module> modules = new Stack<Module>();
   private InputManager inputManager;

   public StateManager(InputManager inputManager) {
     this.inputManager = inputManager;
   }

   public void processUserInput() {
     modules.peek().processUserInput(inputManager.getKeyInputs(), inputManager.getMouseInputs(),
         inputManager.getActionInputs());
   }

   public void update(double delta) {
     modules.peek().update(delta);
   }

   public void render() {
     modules.peek().gui.canvas();
     modules.peek().gui.repaint();
   }

   public void addModule(Module module) {
     modules.push(module);
   }

   public void removeCurrentModule() {
     modules.pop();
   }

   public Module getCurrentModule() {
     return modules.peek();
   }
}

Hier schließlich die GUI-Klasse, von der jedes Module eine eigene erweiterte Version besitzt.
Java:
package engine;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public abstract class GUI extends JPanel {
   private static final long serialVersionUID = 1L;

   private BufferedImage canvas;
   protected Graphics2D g;
   protected InputManager inputManager;

   public GUI(int width, int height) {
     setPreferredSize(new Dimension(900, 600));
   }

   void initGUI() {
     setLayout(null);
     setFocusable(true);
     requestFocus();
     canvas = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
     g = canvas.createGraphics();
   }

   public abstract void canvas();

   @Override
   public void paintComponent(Graphics g2) {
     super.paintComponent(g2);
     g2.drawImage(canvas, 0, 0, null);
   }
}

Die Frage ist die, wie kann ich meine Buttons und andere Komponenten optimal über meine manuellen Zeichnungen setzen?
 

Niky

Mitglied
Ok, es gab streng genommen eigentlich gar kein Problem. Wenn ich das ganze nicht manuell hinzufüge, wird spätestens ab dem nächsten Schleifendurchlauf auf den JPanel Standard-LayoutManager zugegriffen (FlowLayout). Durch ständiges Aufrufen der Methode setBounds() in der Schleife bin ich den LayoutManager effektiv umgangen. Die unterschiedlichen Ergebnisse sind daraufhin zurückzuführen.

Brauche damit also keine weiteren Antworten, trotzdem vielen Dank für eventuelle Bemühungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
K Swing JButton über JLabel AWT, Swing, JavaFX & SWT 6
S JButton und textfield.setText - Komponenten über-/verdecken sich AWT, Swing, JavaFX & SWT 15
S JButton -> Text über Icon AWT, Swing, JavaFX & SWT 4
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
S Cursor über JButton ändern AWT, Swing, JavaFX & SWT 4
S JButton über Schleife erstellen AWT, Swing, JavaFX & SWT 4
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben