문제

멤버 입력을 요청하기 위해 내부 (비 창) 대화 상자를 원합니다. 대화 상자를 기존 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가 거짓을 반환하지 않는 한 겹치는 어린이가 없다고 가정합니다)

[1]: http://java.sun.com/j2se/1.5.0/docs/api/java/awt/container.html#setcomponentzorder(java.awt.component, int)

다음과 같은 노동되지 않은 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에서 오버레이 레이아웃에 대한 언급이 거의 보지 못했기 때문입니다. 계속 검색하는 사람.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top