Ich habe eine benutzerdefinierte JPanel
Klasse und ich will es mehrere Rechtecke und Texte vor seiner Kind-Komponenten zu malen. Ich habe diese Methode außer Kraft gesetzt:Komponenten rendern eine ungewöhnliche Weise
public void paint(Graphics g){
g = getComponentGraphics(g);
super.paint(g);
//paint my custom content
}
super.paint
Anrufe paintChildren
whitch die untergeordneten Komponenten zieht. Aber die Kind-Komponenten erscheinen vor meinen eigenen Inhalten, und manchmal streiten sie auch miteinander.
Ich bin absolut ahnungslos über das, was dies verursachen könnte.
HINWEIS: Ich verwende setComponentZOrder
in meinem Code, und meine JPanel
findet in einem JScrollPane
statt.
EDIT: Die Komponenten ZFight auch wenn ich nie die SetComponentZOrder-Methode aufrufen.
EDIT 2:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.accessibility.Accessible;
import javax.accessibility.AccessibleSelection;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example extends JPanel{
private static final long serialVersionUID = 1L;
public static void main(String[] atgs){
JFrame frame = new JFrame("ZFightingExample");
frame.setSize(new Dimension(500,500));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ExamplePanel panel = new ExamplePanel();
frame.add(panel);
Example a = new Example(new Rectangle(5,5,50,50)),
b = new Example(new Rectangle(40,40,50,50));
panel.add(a);
panel.add(b);
frame.setVisible(true);
}
public Example(Rectangle bounds){
super();
setBounds(bounds);
}
public void paint(Graphics g){
super.setBackground(Color.GREEN);
g.fillRect(0, 0, getWidth()-1, getHeight()-1);
super.paint(g);
g.setColor(Color.BLACK);
g.drawRect(0, 0, getWidth()-1, getHeight()-1);
}
}
class ExamplePanel extends JPanel{
private static final long serialVersionUID = 1L;
public ExamplePanel(){
super(null);
accessibleContext = new Accessiblecontext();
};
protected class Accessiblecontext extends AccessibleJPanel implements AccessibleSelection{
private static final long serialVersionUID = 1L;
public int getAccessibleSelectionCount() {return 2;}
public Accessible getAccessibleSelection(int i) {return (Accessible)getComponent(i);}
public boolean isAccessibleChildSelected(int i) {return true;}
public void addAccessibleSelection(int i) {}
public void removeAccessibleSelection(int i) {}
public void clearAccessibleSelection() {}
public void selectAllAccessibleSelection() {}
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.BLUE);//Should be in front of the Green boxes...
g.drawRect(10, 10, 75, 75);
}
}
1) Für bessere Hilfe, früher, ein [MCVE] oder [kurze, selbständige, korrekte Beispiel] (http://www.sscce.org/). 2) scheint, dass Sie mehr Glück mit einem 'JLayeredPane' haben können, aber das ist nur eine Vermutung. Posten Sie einen MCVE und eine detaillierte Beschreibung dessen, was passieren soll. –
3) Sogar von * "Ich habe eine benutzerdefinierte' JPanel' .. 'öffentliche void Farbe (Graphics g) {' "* Es ist offensichtlich, dass Sie in der falschen Richtung über benutzerdefinierte Malerei gehen. –
"Swing-Programme sollten' paintComponent() 'überschreiben, anstatt' paint() '' zu überschreiben. "- [* Painting in AWT and Swing: Die Malmethoden *] (http://www.oracle.com/technetwork/java/ painting-140037.html # Rückrufe). – trashgod