Java Swing- 다른 패널 위에 패널을 보여주는 방법?
문제
멤버 입력을 요청하기 위해 내부 (비 창) 대화 상자를 원합니다. 대화 상자를 기존 JPANEL에 중앙에 배치하고 싶습니다.
나는 보았다 레이어드 팬 그리고 이들은 모든 창에서 단일 레이아웃 관리자 (또는 레이아웃 관리자가 없음) 만 있기 때문에 사용할 수없는 것 같습니다. 나는 JlayeredPane을 무시하고 맞춤형 레이아웃을 제공 할 수 있다고 생각하지만 이것은 극단적 인 것 같습니다.
유리창 적절하지 않은 것 같습니다.
이 작업은 어떻게 할 수 있습니까? 스윙에 사용 가능한 z- 인덱스 개념이 없습니까?
편집하다
계층화 된 PANE이 적절하지 않은 이유는 레이어 당 레이아웃 관리자가 부족했기 때문입니다. 패널은 방지 가능하며 패널 A는 영역의 100%에 유지되어야하며 패널 B는 중앙 집중식을 유지해야합니다.
해결책
나는 여기서 당신의 가장 좋은 방법이라고 생각합니다. A와 B를 포함하려면 세 번째 패널이 필요합니다.이 세 번째 패널은 레이어드 페인이며 패널 A와 B는 여전히 멋진 레이아웃 관리자를 가질 수 있습니다. 당신이해야 할 일은 중심 B를 통해 중앙 B입니다. 그리고 스윙 트레일에는이 작업을 수행하는 방법에 대한 많은 예가 있습니다. LayoutManager가없는 포지셔닝 튜토리얼.
public class Main {
private JFrame frame = new JFrame();
private JLayeredPane lpane = new JLayeredPane();
private JPanel panelBlue = new JPanel();
private JPanel panelGreen = new JPanel();
public Main()
{
frame.setPreferredSize(new Dimension(600, 400));
frame.setLayout(new BorderLayout());
frame.add(lpane, BorderLayout.CENTER);
lpane.setBounds(0, 0, 600, 400);
panelBlue.setBackground(Color.BLUE);
panelBlue.setBounds(0, 0, 600, 400);
panelBlue.setOpaque(true);
panelGreen.setBackground(Color.GREEN);
panelGreen.setBounds(200, 100, 100, 100);
panelGreen.setOpaque(true);
lpane.add(panelBlue, new Integer(0), 0);
lpane.add(panelGreen, new Integer(1), 0);
frame.pack();
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Main();
}
}
SetBounds를 사용하여 패널을 레이어 파인 안에 배치하고 크기를 설정합니다.
원래 게시물의 변경 사항을 반영하기 위해 편집합니다상위 컨테이너가 크기를 조정하는시기를 감지 한 구성 요소 리스너를 추가 한 다음 패널 A와 B의 한계를 동적으로 변경해야합니다.
다른 팁
나는 단지 거기에 그것을 추가 할 것이라고 생각했다 ~이다 스윙에서 Z-Order 개념, [java.awt.component#setcomponentzorder] [1
이는 부모 구성 요소 배열에서 구성 요소의 위치에 영향을 미치며 그림 순서를 결정합니다.
재정의해야합니다 javax.swing.jcomponent#isoptimizedDrawingEnabled 부모 컨테이너에서 False를 반환하여 겹치는 구성 요소가 올바르게 다시 표시되도록하는 경우, 그렇지 않으면 리피트가 서로 닫히게됩니다. (jcomponents는 isoptimized drawingenabled가 거짓을 반환하지 않는 한 겹치는 어린이가 없다고 가정합니다)
다음과 같은 노동되지 않은 jdialog를 추가 할 수 있습니다.
import java.awt.event.*;
import javax.swing.*;
public class TestSwing {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Parent");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
final JDialog dialog = new JDialog(frame, "Child", true);
dialog.setSize(300, 200);
dialog.setLocationRelativeTo(frame);
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
dialog.add(button);
dialog.setUndecorated(true);
dialog.setVisible(true);
}
}
기존 JPANEL에서 1 x 1 GRIDLAYOUT를 사용한 다음 해당 JPANEL에 패널을 추가하십시오. 1 x 1 인 GridLayout의 유일한 문제는 JPANEL에 다른 항목을 배치 할 수 없다는 것입니다. 이 경우 적합한 레이아웃을 알아 내야합니다. 사용하는 각 패널은 자신의 레이아웃을 사용할 수 있으므로 문제가되지 않습니다.
이 질문을 올바르게 이해하고 있습니까?
joptionpane.showinternalinputdialog는 아마도 당신이 원하는 것을 할 것입니다. 그렇지 않다면 누락 된 것을 이해하는 것이 도움이 될 것입니다.
여기에는 관심이있는 다른 레이아웃 관리자가 있습니다. 오버레이 레이아웃간단한 튜토리얼은 다음과 같습니다. 오버레이 레이 아웃 : 서로 위에있는 구성 요소의 레이아웃 관리. 오버레이 레이아웃을 사용하면 패널을 서로 위에 놓고 각 패널 안에 레이아웃을 설정할 수 있습니다. 또한 각 패널의 크기와 위치를 별도로 설정할 수 있습니다.
(몇 년 전부터이 질문에 대답 한 이유는 같은 문제를 발견했기 때문에 StackoverFlow에서 오버레이 레이아웃에 대한 언급이 거의 보지 못했기 때문입니다. 계속 검색하는 사람.)