Zeichnen in Swing

Status
Nicht offen für weitere Antworten.

biker126

Bekanntes Mitglied
hallöchen

hab n problem und zwar weiss ich nicht genau, wie ich in Swing in nem JFrame was zeichnen kann und gleichzeitig Komponenten anzeigen kann.

hab hier schon bisl rumgesucht und gesehn, dass ich in der paintComponent (vom JFrame nehm ich mal an) zeichnen müsste (ich will images mit g.drawImage() zeichnen). das klappt aber nicht so ganz, da meine JLabel's und JButton's dann nicht mehr richtig angezeigt werden...

wär nett wenn mir jmd sagen könnte wie man da vorgeht!

was vl auch noch relevant ist: ich hab nen Thread, in dessen run() methode ich alle 20ms (also immer ein Thread.sleep(20) die repaint() methode aufrufe (weil sich die images, bzw. deren positionen etc ändern).
 

8ull23y3

Bekanntes Mitglied
Hm ich weiß nicht genau was du da vor hast... Liegen die Bildchen hinter den Labels usw?

Wenn ja würde ich vielleicht für für die Componenten selbst ein JLayeredPane vorschlagen was du deinem Panel übergibst.
 

biker126

Bekanntes Mitglied
jo das problem ist, dass ich quasi auf dem ganzen screen verstreut bilder zeichnen will und darüber dann buttons/labels etc.

das heisst das zeugs wird irgendwie immer wieder übermalt oder so... gibt auf jeden fall komische effekte...

mit AWT war das ganze kein problem, da konnt ich einfach die paint() methode (bzw. die update() für double-buffering) implementieren und die komponenten wurden trotzdem ganz normal angezeigt. aber in Swing klappt das offenbar nicht.

hat noch jmd ne idee?
 
B

Beni

Gast
In Swing sollte man die "paintComponent"-Methode überschreiben, IMHO reicht dies bereits. Vielleicht noch einige Componenten mit "setOpaque( false )" durchsichtig machen, damit die Bilder auch durchscheinen.
 

biker126

Bekanntes Mitglied
offenbar drück ich mich ungenau aus... ich probiers nochmal:

ich hab mir jetzt eine neue klasse gemacht:
Code:
class PaintScreen extends JPanel
{
    protected void paintComponent( Graphics g )
    {
        super.paintComponent(g);
        setBackground(new Color(0,128,0));
        GM.spieler[0].drawDeck(g, Hearts.wnd);
        GM.spieler[1].drawDeck(g, Hearts.wnd);
        GM.spieler[2].drawDeck(g, Hearts.wnd);
        GM.spieler[3].drawDeck(g, Hearts.wnd);
        GM.drawCards(g, Hearts.wnd);
    }
}

als lokale klasse meines fensters. in *.drawDeck() werden mittels g.drawImage() Bilder irgendwo im fenster gezeichnet.

mein fenster konstruktor startet einen thread, und in dessen run() methode werden mit folgender funktion die komponenten hinzugefügt:

Code:
private void addGUIElements()
{
    screen = new PaintScreen();
    screen.setBounds(0,0,height, width);
    contentPane.add(screen);
    // labels für die player names
    player[0] = new JLabel(GM.spieler[0].getPlayerName(), JLabel.CENTER);  
    player[0].setFont(new Font("serif", Font.BOLD, 12));
    player[0].setBounds(100,height-60, 80, 20);
    contentPane.add(player[0]);
    ...

danach wird in der run() methode eine while(true)-loop gestartet die ein Thread.sleep(20); und ein repaint(); macht.

also in etwa so:
Code:
public void run()
{
    addGUIElements();
    while (true)
    {
        repaint();
        try
        {
            Thread.sleep(50);
        }
        catch (InterruptedException e){}
    }	
}

das problem ist jetzt, das die JLabels zb. (hat noch andere komponenten) nicht angezeigt werden. evtl. weil sie vom PaintScreen-Panel überdeckt werden?
 

André Uhres

Top Contributor
biker126 hat gesagt.:
..das problem ist jetzt, das die JLabels zb. (hat noch andere komponenten) nicht angezeigt werden. evtl. weil sie vom PaintScreen-Panel überdeckt werden?
Dann setzt sie einfach direkt in das PaintScreen-Panel.
Jedenfalls können sie dann nicht mehr von ihm überdeckt werden.
"paintComponent(..)" stört dabei überhaupt nicht :D
 

biker126

Bekanntes Mitglied
dann muss ich einfach anstatt:

Code:
player[0] = new JLabel(GM.spieler[0].getPlayerName(), JLabel.CENTER);  
player[0].setFont(new Font("serif", Font.BOLD, 12)); 
player[0].setBounds(100,height-60, 80, 20); 
contentPane.add(player[0]);

das label dem panel hinzufügen? mit
Code:
screen.add(player[0]);
richtig?

noch ne kurze frage:

wenn ich in AWT was gezeichnet hab, dann war die ausrichtung ja immer zur ganz linken oberen ecke des frames. aber wenn ich jetzt in Swing was in der paintComponent() eines Panels zeichne, dann is die ausrichtung immer zur linken oberen ecke der CONTENTPANE, richtig? und die fängt ja erst nach dem frame-rahmen und dem menu an..?
 

André Uhres

Top Contributor
biker126 hat gesagt.:
dann muss ich einfach..das label dem panel hinzufügen? ..richtig?
Ja, genau. So einfach ist es.

biker126 hat gesagt.:
..wenn ich jetzt in Swing was in der paintComponent() eines Panels zeichne,
dann is die ausrichtung immer zur linken oberen ecke der CONTENTPANE, richtig?
und die fängt ja erst nach dem frame-rahmen und dem menu an..?
Naja, in deinem Fall vielleicht, weil der Panel genau ins contentPane reinpasst.
Aber eigentlich stellen die Koordinaten (0,0) die obere linke Ecke des JPanels dar
(oder irgendeiner anderen JComponent die du mit paintComponent(..) malst).
 

biker126

Bekanntes Mitglied
hab gleich das nächste problem:

wenn ich in meine while-loop mit dem repaint() komme (siehe oben), dann stimmt die position der Labels nicht mehr. muss ich die bei jedem neuzeichnen quasi neu setzen? ich weiss nicht genau wann ein repaint aufgerufen wird. aber zB. wenn ich auf nen Knopf drück, der mir den text eines labels ändert passiert das gleiche...

(alle Komponenten springen an die obere kante des Panels und sind dort zentriert hintereinander aufgereiht... oO)

EDIT:

ich hab grad gemerkt, dass ich die Komponten sogar innerhalb der paintComponent() vom Panel ausrichten kann, damit bleiben sie jetzt wo sie sind (weiss aber nicht, ob das die beste variante ist...).

bin aber schon beim nächsten Problem:

dialogboxen, die ich über mein menu öffne werden nicht richtig (neu)gezeichnet... woran liegt das jetzt wieder???
 

biker126

Bekanntes Mitglied
hat niemand eine idee warum meine Dialogboxen nicht richtig gezeichnet werden?

ich vermute mal, das es was mit dem JPanel zu tun hat.

weil als mein Frame noch ein Frame war (und kein JFrame, ich musste das auf wunsch umbauen... :/ ) ging das alles noch einwandfrei...

und auch jetzt werden Dialoge, die angezeigt werden bevor mein JPanel (das zum zeichnen) erstellt wird, ganz normal dargestellt...

der ablauf is momentan folgender:

- JFrame konstruktor startet einen Thread
- Thread startet run()
- run() ruft einen Dialog auf, dieser wird richtig gezeichnet
- nach beenden dieses dialogs wird mein JPanel inkl. aller Komponenten erstellt
- eine while-loop in der run() startet; mit Thread.sleep(20) und repaint()
- wird jetzt ein Dialog geöffnet wird dieser nicht vollständig gezeichnet (buttons zB. erst wenn man mit der Maus drüberfährt. labels sieht man gar nicht, borders auch nicht usw.)

wär echt froh wenn mir jmd ein paar tipps geben könnte, worauf man achten muss und was alles probleme gibt.

hab schon in mehreren online-büchern gesucht aber da steht das ganze immer nur sehr knapp (so a la: "man überschreibe die paintComponent() und gut ist"). aber offensichtlich mach ich noch irgendwas ziemlich falsch... :/
 

biker126

Bekanntes Mitglied
oke, hab mal probiert ein einigermassen anständiges KSKB zu machen (wie gewünscht möglichst alles unnötige rausgeschmissen).

das programm startet man mit der hearts.class. das "anschauungs-fehler-objekt" wäre der "anmeldung" dialog. anfangs sieht der wie schon gesagt normal aus, danach nicht mehr (wenn man ihn im menu-->neu aufruft). das menu alleine macht auch schon probleme, wenn mans auf und zu klappt hat man nachher so nen grauen rand in den ecken...

wär wirklich nett wenn sich jmd das angucken könnte... falls gewünscht könnt ich auch einfach den code hier posten, sind aber immer noch 500+ zeilen. wollt nich das ganze forum zuspammen :p

KSKB
 

André Uhres

Top Contributor
biker126 hat gesagt.:
oke, hab mal probiert ein einigermassen anständiges KSKB zu machen..
Super!

Ich hoffe ich hab nichts vergessen, probier's mal so:

Dem screen --> null Layout verpassen damit die setBounds richtig greifen
paintComponent: die JComponents wieder rausnehmen
Menu-->Swing, JMenuBar, setJMenuBar(..)
Code:
//package kskb;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainMenu extends JMenuBar {
    private JMenu m;
    private JMenuItem mi;
    public static CheckboxMenuItem miMerker, miInGameStats;
        /* **************
         * Konstruktor	*
         ****************/
    public MainMenu(ActionListener listener) {
        // Menu "Spiel"
        m = new JMenu("Spiel");
        // "Datei Neu"
        mi = new JMenuItem("Neu");
        mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, 0));//InputEvent.CTRL_MASK
        mi.setActionCommand("Neu");
        mi.addActionListener(listener);
        m.add(mi);
        m.addSeparator();
        // "Beenden"
        mi = new JMenuItem("Beenden");
        mi.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, 0));//InputEvent.CTRL_MASK
        mi.setActionCommand("Beenden");
        mi.addActionListener(listener);
        m.add(mi);
        add(m);
    }
}
Achja das noch:
Code:
    private void addGUIElements() {
        // Zeichen-Panel erstellen
..
        screen.setBackground(new Color(0,128,0));//<----gehört nicht ins paintComponent !
        screen.setLayout(null);//<--sonst greifen deine setBounds nicht richtig!
 
G

Gast

Gast
Hallo, ich hab ein kleines Problem:

Ich muss eine mathematiche Figur in ein Frame zeichnen.
Ich habe es geschafft,dass ich die Punkte bestimmte,
aber ich kann tun was ich will ich kann diese Punkte einfach nicht zu einer Figur durch Linien verbinden
!
Ich hab es mit der Funktion drawLine(x1, y1, x2, y2) probiert,
aber es wird einfach nichts gezeichnet!
Ich habe es auch mit anderen Klassen probiert, die richtig waren, und es kommt trotzdem nichts raus.

Ich bin noch Anfängerin, wenn ihr eine passende Lösung habt, dann hilft mir BITTE.

Ein Problem hätte ich noch und zwar wie muss ich vorgehen,
wenn ich eine Figur in ein Frame habe, dass wenn ich das Fenster vergrößere das ganze Bild größer wird?

Bitte hilft mir,
es geht um Leben oder Tot.

Danke für eure bemühungen

LG
 

biker126

Bekanntes Mitglied
danke schonmal, hab die änderungen vorgenommen :)

aber das problem mit der Dialogbox besteht immer noch :(

hast du das programm mal laufen lassen und die dialogbox mal mit menu->neu gestartet? die wird leider immer noch ned richtig gezeichnet :/
 

André Uhres

Top Contributor
biker126 hat gesagt.:
..aber das problem mit der Dialogbox besteht immer noch..
Hast du auch in paintComponent() schön aufgeräumt? :wink:
Code:
       protected void paintComponent( Graphics g ) {
            super.paintComponent(g);
            g.drawImage(Hearts.wnd.herz[2],50,50,null);
            g.setColor(new Color(232,232,232));
            g.fillRect(0,panelHeight-20,panelWidth,20);
        }
 

biker126

Bekanntes Mitglied
haha, hau mich bitte ned aber:

ich hab die korrekturen bei meinem hauptprojekt gemacht aber natürlich das unkorrigierte KSKB getested (jaja ecplise und die projekte ;)).
das korrigierte projekt funktioniert soweit wunderbar! :D

dank dir viel mals!!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
I swing fenster neu zeichnen, wenn überdeckt AWT, Swing, JavaFX & SWT 8
E Rauten per Swing zeichnen lassen AWT, Swing, JavaFX & SWT 5
P Zeichnen von Ovalen in Swing (4 Gewinnt) AWT, Swing, JavaFX & SWT 3
GUI-Programmer Zeichnen in Swing - Frage AWT, Swing, JavaFX & SWT 6
B Zeichnen in Swing - Jede Menge Fragen! AWT, Swing, JavaFX & SWT 2
Psypsy Bewegtes zeichnen in Swing AWT, Swing, JavaFX & SWT 24
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
M Swing Zeichnen AWT, Swing, JavaFX & SWT 3
byte Swing: Ebenen zeichnen AWT, Swing, JavaFX & SWT 3
G Frage zu Zeichnen in Swing Tutorial AWT, Swing, JavaFX & SWT 4
R Swing + Zeichnen Problem AWT, Swing, JavaFX & SWT 7
I Swing-Komponenten skaliert zeichnen AWT, Swing, JavaFX & SWT 6
F Effizientes zeichnen mit Swing AWT, Swing, JavaFX & SWT 9
S Thread.sleep() beim Zeichnen auf Swing Komponenten? AWT, Swing, JavaFX & SWT 6
V Zeichnen mit Swing AWT, Swing, JavaFX & SWT 3
W Zeichnen auf eine Swing-Komponente AWT, Swing, JavaFX & SWT 5
G Zeichnen mit Swing AWT, Swing, JavaFX & SWT 5
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben