문제

간단히 말해서, 일부 구성 요소가있는 JFrame으로 구성된 간단한 Java Swing 앱이 있습니다. 구성 요소 중 하나는 사용자 조치에 대한 다른 jpanel로 대체되는 jpanel입니다.

그렇다면 그런 일을하는 올바른 방법은 무엇입니까? 난 노력 했어

panel = new CustomJPanelWithComponentsOnIt();
parentFrameJPanelBelongsTo.pack();

그러나 이것은 작동하지 않습니다. 무엇을 제안 하시겠습니까?

도움이 되었습니까?

해결책

당신의 유스 케이스는 완벽 해 보입니다 Cardlayout.

카드 레이아웃에서는 같은 장소에 여러 패널을 추가 할 수 있지만 한 번에 하나의 패널을 표시하거나 숨길 수 있습니다.

다른 팁

1) 첫 번째 패널 설정 :

JFrame frame=new JFrame();
frame.getContentPane().add(new JPanel());

2) 패널 교체 :

frame.getContentPane().removeAll();
frame.getContentPane().add(new JPanel());

또한이 사용을 위해 이벤트 스레드 에서이 작업을 수행해야합니다. Swingutilities.invokelater 아니면 그 스윙 워크

frame.setContentPane(newContents());
frame.revalidate(); // frame.pack() if you want to resize.

Java는 '값별로 복사 참조'인수 통과를 사용하십시오. 따라서 변수를 변경하면 참조의 사본이 다른 방법으로 전달되지 않습니다.

또한 참고 JFrame 유용성의 이름으로 매우 혼란 스럽습니다. 구성 요소 추가 또는 레이아웃 설정 (일반적으로)은 컨텐츠 창에서 작동을 수행합니다. 이상하게도 레이아웃을 얻으면 프레임의 레이아웃 관리자가 실제로 제공됩니다.

이 코드가 JFrame 내부에서 JPANEL을 변경한다는 아이디어를 제공하기를 바랍니다.

public class PanelTest extends JFrame {

        Container contentPane;

        public PanelTest()  {
           super("Changing JPanel inside a JFrame");
           contentPane=getContentPane();
        }

        public void createChangePanel() {
           contentPane.removeAll();
           JPanel newPanel=new JPanel();
           contentPane.add(newPanel);
           System.out.println("new panel created");//for debugging purposes
           validate();
           setVisible(true);
        }
}

사용자 조치에서 :

// 라인을 따라 무언가를해야합니다.

myJFrame.getContentPane().removeAll()
myJFrame.getContentPane().invalidate()

myJFrame.getContentPane().add(newContentPanel)
myJFrame.getContentPane().revalidate()

그런 다음 필요에 따라 wndow를 크기를 조정할 수 있습니다.

그것은 모두 그것이 어떻게 사용될 것인지에 달려 있습니다. 이 두 패널 사이에서 앞뒤로 전환하려면 Cardlayout을 사용하십시오. 당신이 첫 번째에서 두 번째로 한 번만 전환하고 (그리고 돌아 가지 않으면) 나는 Telcontar제안하고 그냥 대체하십시오. jpanel만이 당신의 프레임에서 유일한 것이 아니라면 내가 사용할 것입니다.제거 (java.awt.component) Removeall 대신.

이 두 경우 사이에있는 경우 기본적으로 타임 스페이스 트레이드 오프. Cardlayout은 시간을 절약하지만 항상 다른 패널을 메모리에 유지해야함으로써 더 많은 메모리를 차지합니다. 그러나 필요할 때 패널을 교체하고 주문형으로 구성하는 경우, 해당 Meory를 유지할 필요는 없지만 전환하는 데 더 많은 시간이 걸립니다.

또한 JTabbedpane을 사용하여 대신 탭을 사용해야합니다 (자동으로 표시/숨기기를 처리하기 때문에 Cardlayout보다 훨씬 쉽습니다).

다른 사람들이 질문에 대답했습니다. 콘텐츠를 교체하는 대신 JTabbedpane을 사용하는 것이 좋습니다. 일반적으로 응용 프로그램의 시각적 요소가 사라지거나 다른 콘텐츠로 대체되는 것은 좋지 않습니다. 확실히 모든 규칙에는 예외가 있으며 귀하와 사용자 커뮤니티만이 최선의 접근 방식을 결정할 수 있습니다.

문제: 컨테이너에 추가 한 후에는 내 구성 요소가 나타나지 않습니다.

호출해야합니다 재평가 그리고 다시 칠해 추가 후 구성 요소 그것이 나타나기 전에 컨테이너에.

원천: http://docs.oracle.com/javase/tutorial/uiswing/layout/problems.html

나는 정확히 같은 문제를 겪고 있었다 !! 설명 할 수 없다 !! 내가 찾은 해결책은 다음과 같습니다.

  1. 컨테이너에 모든 구성 요소 (jpanel)를 추가합니다.
  2. 그들 모두에게 setvisible (false) 메소드를 사용합니다.
  3. 사용자 조치에서 SetVisible (true)을 내가 보여주고 싶은 패널로 설정합니다.
// Hiding all components (JPanels) added to a container (ex: another JPanel)
for (Component component : this.container.getComponents()) {
      component.setVisible(false);
}
// Showing only the selected JPanel, the one user wants to see
panel.setVisible(true);

Revalidate (), Validate (), Cardlayout가 필요하지 않습니다.

Layout.replace () 답변은 GrouPlayout Manager에만 존재/작동합니다.

다른 LayoutManagers (Cardlayout, BoxLayout 등)는이 기능을 지원하지 않지만 먼저 제거해야합니다 (그리고 AddLayoutComponent (다시 다시. :) [레코드를 직접 설정]합니다.

프레임 생성에 두 패널을 추가 한 다음 둘 다에서 setvisible (true/false)을 호출하여 가시 패널을 변경하는 것이 좋습니다. SetVisible에 전화 할 때 부모에게 통보를 받고 스스로 리베인하도록 요청받습니다.

class Frame1 extends javax.swing.JFrame {

    remove(previouspanel); //or getContentPane().removeAll();

    add(newpanel); //or setContentPane(newpanel);

    invalidate(); validate(); // or ((JComponent) getContentPane()).revalidate();

    repaint(); //DO NOT FORGET REPAINT

}

때때로 당신은 재평가를 사용하지 않고 때로는 페인트를 사용하지 않고 작업을 수행 할 수 있습니다.

방법을 호출하십시오 팩() 설정 후 ContentPane, (java 1.7, 아마도) : 이렇게 :

JFrame frame = new JFrame();  
JPanel panel1 = new JPanel(); 
JPanel panel2 = new JPanel(); 
....
frame.setContentPane(panel1);
frame.pack();
...

frame.setContentPane(panel2);
frame.pack();
...

레이아웃의 교체 방법을 사용할 수 있습니다.

layout.replace(existingComponent, newComponent)

기존 및 새로운 구성 요소도 jpanels 일 수 있습니다.

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