Setzen JPanel hintergrund transparent, setOpaque() lässt mich nicht malen

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Tetris extends JFrame {

public Tetris() {

    add(new GamePanel());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setResizable(false);
    setSize(800, 600);
    setVisible(true);
    setLocationRelativeTo(null);
    setTitle("Tetris");
}

public class GamePanel extends JPanel {


    public GamePanel(){
        TetrisBoard tetraBoard= new TetrisBoard();
        GridBagLayout layout= new GridBagLayout();
        this.setLayout(layout);
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 2;
        c.gridy = 1;
        c.ipadx = 190;
        c.ipady = 390;
        c.insets.left= 360;
        layout.setConstraints(tetraBoard, c);
        this.add(tetraBoard);
        setBackground(Color.WHITE);
    }

   @Override
   public void paint(Graphics g){
       super.paint(g);

       g.setFont(new Font("Birth Std", Font.PLAIN, 12));
       g.setColor(Color.LIGHT_GRAY);
       g.drawString("200", 36, 63);
       g.drawString("200", 36, 88);
       g.drawString("200", 36, 114);
    }

}//GamePanel class

public class TetrisBoard extends JPanel implements Runnable{
    private Thread animator= new Thread(this);
    private final int DELAY= 50;

    public TetrisBoard(){
        setFocusable(true);
        //setBackground(Color.WHITE);
        setDoubleBuffered(true);
        //this.setBackground(Color.BLACK);
        setOpaque(false);
    }

    @Override
    public void addNotify() {
    super.addNotify();
        animator = new Thread(this);
        animator.start();
    }//addNotify


   @Override
   public void paint (Graphics g){
       super.paint(g);
       g.drawRect (20, 30, 130, 50);

   }//paint

   @Override
public void run() {
    long beforeTime, timeDiff, sleep;

    beforeTime = System.currentTimeMillis();

    while (true) {
        repaint();

        timeDiff = System.currentTimeMillis() - beforeTime;
        sleep = DELAY - timeDiff;

        if (sleep < 0)
            sleep = 2;
        try {
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            System.out.println("interrupted");
        }

        beforeTime = System.currentTimeMillis();
    }
} 

}//TetrisBoard class


public static void main(String[] args) {
    Tetris t = new Tetris();
}

}

Mit diesem code das Ergebnis ist, dass es keine Farbe überhaupt. Ich will einfach nur den hintergrund transparent sein, nicht die Bilder, die übermalt den hintergrund, aber es sieht aus wie der paint-Methode Malt nicht, wenn ich setOpaque(false).

Edit: wie gewünscht habe ich geschrieben einen einfachen code, TetraBoard Hinzugefügt GamePanel (über das GridBagLayout), und GamePanel ist Hinzugefügt, um die Rahmen, die 3 Klassen sind separate Dateien. Ich will TetraBoard, um einen transparenten hintergrund haben, damit ich sehen kann, der hintergrund GamePanel, aber was ich Male auf tetraboard muss sichtbar sein. Wenn ich setOpaque(false), TetraBoard transparent ist, aber es auf transparenten alles, was ich in Farbe auf.

  • Für bessere Hilfe früher, nach einem SSCCE. In einem JPanel überschreiben paintComponent(Graphics) eher als paint(Graphics)
  • Ich habe eine einfachen code, ich habe versucht, paintComponent anstelle von paint, aber ich habe das gleiche Ergebnis.
  • "Ich habe einen einfachen code, der.." habe ich empfohlen (und betrachten) ein SSCCE. Auch die JPanel noch überschreibt paint()! Sind Sie in der Lage zu Lesen alle den Weg an das Ende eines Satzes? Von einem link Folgen und Lesen der Inhalte?
  • Ich Stimme mit Andrew. Dein problem ist ein Fehlverhalten, und es wäre viel einfacher für uns, Ihnen zu helfen, wenn wir in der Lage waren, zu verstehen, dieses Fehlverhalten, indem Sie sehen, es selbst, indem er code, den wir kompilieren, ausführen, ändern, und hoffentlich richtig, ein Programm, das klein genug ist, um nicht zu ertrinken uns in zu viel zusammenhangsloser-code, so können wir nicht sehen den Wald vor lauter Bäumen nicht, noch groß genug, um kompilierbar und lauffähig ist, kurz gesagt, ein sscce.
  • Sorry für den vorherigen code. Nun der einzige Unterschied mit dem original-code ist, dass ich nicht die Bilder benutzen, aber ich zeichne ein Rechteck. Der code, den ich gepostet funktioniert, aber mein orginal code nicht. Ich verwendet paintComponent aber es funktioniert auch nicht.
InformationsquelleAutor AR89 | 2012-03-21
Schreibe einen Kommentar