저는 사용자 정의 JPanel
클래스를 가지고 있으며, 아이 컴포넌트 앞에 여러 개의 직사각형과 텍스트를 칠하고 싶습니다. 하위 구성 요소를 그립니다 whitch구성 요소가 비정상적인 방식으로 렌더링됩니다.
public void paint(Graphics g){
g = getComponentGraphics(g);
super.paint(g);
//paint my custom content
}
super.paint
전화 paintChildren
:이 방법을 무시했다. 그러나 하위 구성 요소는 내 사용자 지정 콘텐츠 앞에 표시되며 때로는 Z가 서로 대결합니다.
저는이 문제의 원인에 대해 전혀 알지 못합니다.
참고 : setComponentZOrder
을 내 코드에 사용하고 JPanel
은 JScrollPane
에서 발생합니다.
편집 : 구성 요소 ZFight 결코 setComponentZOrder 메서드를 호출 할 경우에도.
편집 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) 더 나은 도움을 받으려면 [MCVE] 또는 [Short, Self Contained, Correct Example] (http://www.sscce.org/)를 게시하십시오. 2)'JLayeredPane'을 사용하면 더 나은 행운을 누릴 수 있습니다. 그러나 이것은 단지 추측에 불과합니다. MCVE 게시 및 일어날 일에 대한 자세한 설명. –
3) * "나는 사용자 정의'JPanel'을 가지고있다.'public void paint (Graphics g) {'"* 사용자 정의 그림에 대해 잘못된 방향으로 가고있다. –
"스윙 프로그램은'paint()'를 오버라이드하는 대신'paintComponent()'를 덮어 써야합니다."- [AWT와 스윙의 페인팅 : 페인트 방법 *] (http://www.oracle.com/technetwork/java/) painting-140037.html # callbacks). – trashgod