2012-09-11 4 views
2

두 개의 JPanel (오른쪽에는 JPanel1, 왼쪽에는 JPanel2)이 포함 된 JFrame으로 환영 화면 용 인터페이스를 설계했습니다. 왼쪽의 버튼은 JPanel1의 패널을 전환하는 것입니다. JPanel1 콘텐츠를 다른 JPanel로 대체하기 위해 단추를 눌러야하지만 어떻게할지는 모르겠다. 도와주세요.2 개의 JPanel 중 하나를 Java의 다른 JPanel로 대체하려면 어떻게해야합니까?

+0

당신이 지금까지 가지고있는 코드를 게시하십시오. 쉬운 해결책은 JPanel1에서'CardLayout'을 사용하는 것이고, 버튼을 누르면'CardLayout.next() '를 호출 할 수 있습니다. –

+0

Id 현재 디자인이 클라이언트에 더 좋기 때문에 CardLayout을 사용하고 싶습니다. 코드에 관해서는 Netbeans를 드래그 앤 드롭에 사용했습니다. 인터페이스는 두 개의 JPanels 왼쪽에있는 버튼으로 나누어 져 있으며 버튼의 효과가 변경되기를 원합니다. 오른쪽에있는 JPanel을 다른 하나와 함께 사용하십시오. –

+0

어리석은 질문 일 수도 있지만 JPanel JPanelOnLeft 변수를 선언하고 그 값을 변경합니까? 예 : JPanelOnLeft를 JPanelOnLeftInitializationValue로 초기화 한 다음 사용자가 단추를 클릭하여 해당 패널의 내용을 바꿀 때 JPanelOnLeft를 JPanelOnLeftContainingUserRequestedContent로 설정합니다. –

답변

0

내가 찾은 가장 좋은 대답은 그때가 주요 인 JPanel를 복사합니다 내가 (JPanelLeft이 버튼을 포함 JPanelRight 버튼이하는 일 포함) 하나의 큰 JPanel의 두 JPanel의를 포함 할 거 하나 JFrame의를 만들 것입니다 각 JButton. 내가 할 것입니다 어떤 버튼을 누르면 (JFrame.getContentPane.removeAll는). 이것은 나를 위해 작동

을 이전 JPanel의 다음 (JFrame.getContentPane.Add (NewJPanel)를 제거하고 내가 원하는대로 내 디자인을 유지합니다. 감사합니다 모든 몸체에 대해

2

CardLayout의 대안은 JRootPane이고 그 방법은 JRootPane.setContentPane()입니다. 다음 예는 다음과 같습니다

final JPanel panel1 = ...; 
final JPanel panel2 = ...; 
boolean showingPanel1 = true; 
final JRootPane rootPane = new JRootPane(); 
rootPane.setContentPane(panel1); 
JButton switchButton = new JButton("Switch"); 
switchButton.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     if (showingPanel1) { 
      rootPane.setContentPane(panel2); 
     } else { 
      rootPane.setContentPane(panel1); 
     } 
     showingPanel = !showingPanel; 
    } 
}); 

는 당신의 창에 rootPaneswitchButton 구성 요소를 추가 한 다음 switchButton을 클릭하면 패널을 전환합니다.

여기에 tutorial이 있습니다. 주로 JRootPane.setContentPane에 관심을 가져야하며 튜토리얼의 다른 내용은 적합하지 않습니다.

+0

고맙지 만이 코드가 어떻게 올바른 JPanle을 새로운 것으로 바꿀지를 설명합니다. 모든 Jframe이 하나의 Panel을 포함하는 것을 바꾸고 싶지 않습니다. –

+0

문자 그대로 오른쪽의'JPanel'을'JRootPane'으로 대체하십시오. 'add (rightPanel)'을 호출하면, 대신에'add (rootPane)'을 호출하고,'JFrame'이 아닌'JRootPane'에'setContentPane (rightPanel)'을 호출하면됩니다. 전환하고 싶으면 새로운 패널로'setContentPane'을 호출하십시오. – Brian

+0

왜 JRootPane을 생성하고 있습니까? JFrame (및 JWindow 및 JDialog 및 JInetrnalFrame)에는 이미 JRootPane이 설치되어 있습니까? 이것은 보풀과 혼란을 추가하는 것입니다 ... – MadProgrammer

3

다음은 설명에 근접해야하는 매우 간단한 예입니다. 왼쪽에는 오른쪽 패널의 내용을 토글하는 포옹 버튼이 있습니다. 오른쪽에는 주어진 테두리와 레이블이있는 패널이 있습니다. 버튼을 누르면 오른쪽의 내용이 다른 패널과 바뀝니다.

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class TestCardLayout2 { 

    protected void initUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel leftPanel = new JPanel(new BorderLayout()); 
     JLabel label = new JLabel("Left panel"); 
     leftPanel.add(label, BorderLayout.NORTH); 
     JButton button = new JButton("Toggle right panel"); 
     leftPanel.add(button); 
     frame.add(leftPanel, BorderLayout.WEST); 

     final CardLayout cardLayout = new CardLayout(); 
     final JPanel rightPanel = new JPanel(cardLayout); 
     rightPanel.setPreferredSize(new Dimension(200, 500)); 

     JPanel rightPanel1 = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
     rightPanel1.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     JPanel rightPanel2 = new JPanel(new FlowLayout(FlowLayout.RIGHT)); 
     rightPanel2.setBorder(BorderFactory.createLineBorder(Color.BLUE)); 
     JLabel label1 = new JLabel("Right panel 1 with a red border"); 
     JLabel label2 = new JLabel("Right panel 2 with a blue borer"); 
     rightPanel1.add(label1); 
     rightPanel2.add(label2); 

     rightPanel.add(rightPanel1, "panel1"); 
     rightPanel.add(rightPanel2, "panel2"); 
     frame.add(rightPanel, BorderLayout.EAST); 

     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       cardLayout.next(rightPanel); 
      } 
     }); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestCardLayout2().initUI(); 
      } 
     }); 
    } 

} 
+0

스레드 "AWT-EventQueue-0"의 예외 java.lang.IllegalArgumentException : 레이아웃에 추가 할 수 없습니다. 제약 조건이 문자열이어야합니다 ... –

+0

@ AbdEl-RahmanEl-Tamawy 제 잘못, JVM7 이전 버전에서 제공해야합니다. CardLayout을 사용하여 컨테이너에 구성 요소를 추가 할 때 "문자열"제약 조건. 포함 된 모든 구성 요소에 대해 모두 다르다면 String을'add' 메소드의 두 번째 인수로 전달할 수 있습니다. –

+0

@ AbdEl-RahmanEl-Tamawy 두 개의 String (문자열) 제약 조건을 추가하여 모든 Java 버전에서 작동하도록했습니다. –

관련 문제