Allora, senza polemica...IL JFrame
vabbè a parte gli scherzi, l'approccio alla parasca "potrebbe" andare anche bene se non fai progetti in team e se non fai qualcosa di sofsticato....chiunque si trova ad affrontare problemi nuovi ogni tanto, quindi è normale documentarsi progressivamente. però alcuni concetti basi bisogna averli chiari. I LayoutManager per le interfacce grafiche sono come il pane e l'acqua per noi. Senza comprendere bene i layout avrai sempre difficoltà a lavorarci.
ora io non ho letto il tuo codice, però ti spiego "al volo" come funziona, a te gli approfondimenti.
Considera che la finestra è un contenitore, che in linea di default mostra "l'ultima" cosa inserita. tu dici che quando aggiungi il pulsante, sparisce lo sfondo, prova a fare il contrario....dovrebbe sparire il pulsante e rimanere solo lo sfondo. questo perchè non hai selezionato un layout che permetta di gestire "più componenti" sulla stessa finestra. Nel tuo caso specifico, poi, il disegno di sfondi su pannelli che poi dovranno andare ad interfacciarsi tra di loro, è ancora "peggio".
Mi spiego: la fase di "disegno" del pannello è delegata al metodo paintCompoent. tu non hai la più pallida idea di come funzioni, ma per poter "disegnare" un pannello specifico, devi interfacciarti per forza di cose con questo meccanismo. In pratica tu devi creare una nuova classe, che chiamerai "PannelloSfondoParasca" e che avrà al suo interno la ridefinizione del metodo paintCOmponent.
a questo punto quando andrai ad agiungere al frame il pannello, lui nsaprà che deve disegnare quel pannello, e andrà ad aggiungere i componenti con "la solita tecnica".
ti copio il codice di un pannello con gradienti fatto da me:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package graphicComponent;
import core.PersonaGenerica;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicPanelUI;
/**
*
* @author Utente1
*/
public class GraficaJPanelPersone extends BasicPanelUI implements java.io.Serializable,
MouseListener, KeyListener {
private final static GraficaJPanelPersone m_pannelloUI = new GraficaJPanelPersone();
public static ComponentUI createUI(JComponent c) {
return m_pannelloUI;
}
public GraficaJPanelPersone(PersonaGenerica persona) {
super();
}
public GraficaJPanelPersone() {
}
@Override
public void installUI(JComponent c) {
super.installUI(c);
c.addMouseListener(this);
c.addKeyListener(this);
}
@Override
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
c.removeMouseListener(this);
c.removeKeyListener(this);
}
@Override
public void paint(Graphics graphic, JComponent c) {
Graphics2D g = (Graphics2D) graphic;
JPanel d = (JPanel) c;
Color bluScuro = new Color(0, 0, 131);
Color celesteScuro = new Color(148, 203, 227);
Color celeste = new Color(64, 128, 227);
GradientPaint gradient;
//coloro il centro
gradient = new GradientPaint(d.getWidth() / 2, d.getHeight() / 2, celesteScuro, 0, 0, celeste, true);
g.setPaint(gradient);
g.fillRect(0, 0, d.getWidth(), d.getHeight());
gradient = new GradientPaint(d.getWidth() / 2, d.getHeight() / 2, celesteScuro, d.getWidth(), 0, celeste, true);
g.setPaint(gradient);
g.fillRect(0, 0, d.getWidth(), d.getHeight());
gradient = new GradientPaint(d.getWidth() / 2, d.getHeight() / 2, celesteScuro, 0, d.getHeight(), celeste, true);
g.setPaint(gradient);
g.fillRect(0, 0, d.getWidth(), d.getHeight());
gradient = new GradientPaint(d.getWidth() / 2, d.getHeight() / 2, celesteScuro, d.getWidth(), d.getHeight(), celeste, true);
g.setPaint(gradient);
g.fillRect(0, 0, d.getWidth(), d.getHeight());
//coloro i 4 angoli
gradient = new GradientPaint(10, 10, celeste, 0, 0, bluScuro, true);
g.setPaint(gradient);
g.fillRect(0, 0, 10, 10);
g.fillRect(d.getWidth() - 10, 0, 10, 10);
g.fillRect(0, d.getHeight() - 10, 10, 10);
g.fillRect(d.getWidth() - 10, d.getHeight() - 10, 10, 10);
}
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
/*
* if(popup != null){ this.popup.setVisible(true);
* this.popup.revalidate();
}
*/
}
@Override
public void mouseExited(MouseEvent e) {
/*
* if(popup != null){ this.popup.setVisible(false);
*
* }
*/
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
In questa classe io non estendo JPanel ma BasicUI perchè ho voluto cambiare lo schema di tutti i jpanel del software...è un discorso diverso. ma in linea generale (anche se cerchi in rete) la ridefinizione di un JPanel funziona allo stesso modo.
Se hai dubbi....sparali