다음 코드가 있습니다. 기본적으로 배경 이미지가있는 프레임이 있습니다. 또한 프레임 내에 3 개의 패널이 있습니다. 1, 2, 3 패널. 2 & 3 서브 클래스로 서브를하지 않아도됩니다. 하지만 패널 1은 서브 클래스를 만들 자마자 즉, JPanel의 paintComponent 메소드 안에 로직을 넣으면 해당 메소드가 호출되지 않고 foo가 결코 인쇄되지 않기 때문에 작동을 멈 춥니 다. 나는 이유를 알 수 없다. 도와 주셔서 감사합니다. 다른 비슷한 스레드에서 몇 가지 제안을 시도했지만 도움이되지 않았습니다.paintComponent가 호출되지 않는 이유는 무엇입니까?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test {
public static void main(String[] args) throws IOException {
JFrame.setDefaultLookAndFeelDecorated(true);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int fooPanelX = 5;
int fooPanelY = 160;
int fooPanelWidth = 470;
int fooPanelHeight = 305;
int bar0PanelX = 5;
int bar0PanelY = 550;
int bar0PanelWidth = 230;
int bar0PanelHeight = 210;
int bar1PanelX = bar0PanelX * 2 + bar0PanelWidth + bar0PanelX;
int bar1PanelY = bar0PanelY;
int bar1PanelWidth = bar0PanelWidth;
int bar1PanelHeight = bar0PanelHeight;
JPanel panel1 = new Panel1(fooPanelX, fooPanelY, fooPanelWidth, fooPanelHeight);
JPanel panel2 = new JPanel();
panel2.setBackground(Color.WHITE);
panel2.setLocation(bar0PanelX, bar0PanelY);
panel2.setSize(bar0PanelWidth, bar0PanelHeight);
panel2.setOpaque(false);
panel2.setBorder(BorderFactory.createLineBorder(Color.WHITE));
panel2.setBounds(bar0PanelX, bar0PanelY, bar0PanelWidth, bar0PanelHeight);
JPanel panel3 = new JPanel();
panel3.setBackground(Color.WHITE);
panel3.setLocation(bar1PanelX, bar1PanelX);
panel3.setSize(bar1PanelWidth, bar1PanelHeight);
panel3.setOpaque(false);
panel3.setBorder(BorderFactory.createLineBorder(Color.WHITE));
panel3.setBounds(bar1PanelX, bar1PanelY, bar1PanelWidth, bar1PanelHeight);
JLabel imagePanel = new JLabel(new ImageIcon(ImageIO.read(new File("image.png"))));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 27) {
System.exit(0);
}
}
});
frame.setContentPane(imagePanel);
frame.getContentPane().add(panel1);
frame.getContentPane().add(panel2);
frame.getContentPane().add(panel3);
frame.setLocation((int) (screenSize.getWidth() * 0.75),
(int) (screenSize.getHeight() * 0.25));
frame.pack();
frame.setVisible(true);
}
@SuppressWarnings("serial")
static class Panel1 extends JPanel {
int x, y, w, h;
public Panel1(int x, int y, int w, int h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
}
@Override
public void paintComponent(Graphics graphics) {
System.out.println("foo");
super.paintComponents(graphics);
setBackground(Color.WHITE);
setLocation(x, y);
setSize(w, h);
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.WHITE));
}
}
}
는 업데이트 : 당신이 문제를 찾을 수없는 경우 당신은 다음과 같은 일을 다른 방법으로 날을 제공 할 수 바랍니다. 배경 이미지가있는 프레임과 배경 이미지 위에 세 개의 패널이 필요합니다. 세 개의 패널은 배경 이미지에서 픽셀이 완벽한 위치와 크기를 가져야합니다. 그게 전부예요. 세 패널을 다시 칠할 것이지만 배경 이미지는 그대로 유지됩니다.
Panel1의 정의에서 정적을 제거하면 어떻게됩니까? – 11684
(** 실제로는 ** 절대) 페인팅 프로세스에서 구성 요소의 상태를 변경하지 마십시오! 그리고 컴포넌트의 수동 크기 조정/위치 지정을하지 마십시오. 적절한 LayoutManager의 독점적 인 작업입니다. – kleopatra
@kleopatra - 감사합니다. 나는 스윙이 처음이다.크기와 위치를 설정하지 않으면 배경 이미지의 특정 지점에 물건을 정확하게 배치해야하는 이유는 무엇입니까? – junkie