Toon posts:

[Java] Background JPanel wijzigen?

Pagina: 1
Acties:
  • 182 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een zo'n simpel mogelijke Java applicatie geschreven die cirkels op een JPanel moet tekenen. Het lukt mij niet om de achtergrond kleur van dit JPanel te wijzigen, ondanks dat ik de methode setBackground aanroep om de achtergrond zwart te maken. Kan iemand mij vertellen wat ik verkeerd doe? (Het tekenen van de cirkels werkt overigens wel goed)

Kleine opmerking: De achtergrondkleur van het JFrame wijzigen zorgt ervoor dat de achtergrondkleur van het JPanel gelijk is aan de kleur van het JFrame.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class AnimationPanel extends JPanel{

    public AnimationPanel() {
        setPreferredSize(new Dimension(200,200));
        setBackground(Color.BLACK);
        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent evt) {
                panelClick(evt);
            }
        });
    }

    private void panelClick(MouseEvent evt) {
        clicked = evt.getPoint();
        repaint();
    }


    public void paint(Graphics g) {
        if(clicked != null && isShowing()) {
            g.setColor(Color.WHITE);
            g.drawOval((int)clicked.getX(), (int)clicked.getY(), 10, 10);
        }
    }

    private Point clicked = null;
}


en voor de zekerheid ook nog de code van de applicatieklasse:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class SimpleAnimation extends JFrame {

    public static void main(String[] args) {
        new SimpleAnimation().show();
    }

    public SimpleAnimation() {
         initComponents();
    }

    private void initComponents() {
        Container contentPane = getContentPane();
        AnimationPanel animationPanel = new AnimationPanel();

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                exitForm(evt);
            }
        });

        contentPane.add(animationPanel, BorderLayout.CENTER);
        pack();
    }

    private void exitForm(WindowEvent evt) {
        System.exit(0);
    }
}

[ Voor 12% gewijzigd door Verwijderd op 29-12-2002 15:29 ]


  • NightBird
  • Registratie: Januari 2000
  • Laatst online: 07-08 21:18

NightBird

DPC-Crew Coding
Conclusie mijnerzijds: je Jpanel is doorzichtig :)

WatHoorJeWaar · Asobakken
Eerdere projecten: Leading Courses · Brandstof-zoeker.nl · Voertuig-zoeker.nl


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik heb laatst iets moeten doen met jpanels en graphics, en ik heb een buffered image opgehaald van de panel. En op die Image heb ik alle teken acties laten plaats vinden. Je moet dus ff zoeken op JPanel +BufferedImage op java.sun.com. Hierdoor gaat je systeem wat minder afhankelijk worden van een gui component.

[ Voor 15% gewijzigd door Alarmnummer op 29-12-2002 16:11 ]


Verwijderd

Topicstarter
Het was even flink puzzelen, maar ik heb het zelf opgelost :)
Ik zal het proberen uit te leggen, mochten er meer mensen zijn die ooit tegen dit probleem oplopen.

Het blijkt dat de manier waarop Java tekent een beetje veranderd is met Swing ... In de tijd van de awt, override je de paint methode en met behulp van de update en repaint methoden werd de paint methode aangeroepen.
Swing zorgt zelf voor een offscreen buffer en werkt dus met dubbel buffering. Van de gebruiker wordt verwacht dat deze de paintComponent methode overschrijft en niet de paint methode. Een verzoek tot repainten doe je nog steeds door een aanroep naar de methode repaint; deze roept de paint methode aan die eerst paintComponent aanroept (die de gebruiker override), vervolgens paintBorder en paintChildren.
Een aanroep naar de super.paintComponent in de paintComponent methode zorgt voor het (bij iedere aanroep) getekend worden van de background. Het overriden van de PaintBorder en PaintChildren methoden is niet wenselijk, maar kan wel.

Bedankt voor jullie hulp :)

Verwijderd

Twee niet erg mooie oplossingen, maar werken wel:
- Een plaatje laden in dat JPanel, dit plaatje maak je gewoon ff zelf, en moet een vlak zijn in de gewenste kleur.
- Een geneste loop maken die elke pixel in het panel de gewenste kleur geeft.

edit: Beetje overbodige post zo te zien... ;)

[ Voor 10% gewijzigd door Verwijderd op 29-12-2002 19:31 ]


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik adviseer toch echt om gewoon een Image van die JPanel op te halen. Jouw graphics systeem heeft niets te maken waarop het getekend moet worden en je moet je systeem daarom dus niet onnodig besmetten met een JPanel. En verder hoef je dus niets te overriden.

Verwijderd

Topicstarter
Een mooi oplossing die ik in mijn achterhoofd zal houden, het voordeel van mijn aanpak is dat ik gewoon allerlei cirkeltjes etc. via de graphics context op het JPanel kan tekenen. En toevallig was ik daar nu even mee bezig.

De aanpak die ik gebruikt heb komt overigens ook van sun zelf :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Verwijderd schreef op 29 December 2002 @ 22:34:
Een mooi oplossing die ik in mijn achterhoofd zal houden, het voordeel van mijn aanpak is dat ik gewoon allerlei cirkeltjes etc. via de graphics context op het JPanel kan tekenen. En toevallig was ik daar nu even mee bezig.

De aanpak die ik gebruikt heb komt overigens ook van sun zelf :)
Jouw voorwaarde uit je modes ponens klopt niet..

als van sun, dan goed..

Ik ben de laatste tijd met een wat kritischer oog naar hun code aan het kijken, en zo nu en dan suckt het erg hard.

[ Voor 3% gewijzigd door Alarmnummer op 29-12-2002 23:15 ]

Pagina: 1