두 개의 JPanel (오른쪽에는 JPanel1, 왼쪽에는 JPanel2)이 포함 된 JFrame으로 환영 화면 용 인터페이스를 설계했습니다. 왼쪽의 버튼은 JPanel1의 패널을 전환하는 것입니다. JPanel1 콘텐츠를 다른 JPanel로 대체하기 위해 단추를 눌러야하지만 어떻게할지는 모르겠다. 도와주세요.2 개의 JPanel 중 하나를 Java의 다른 JPanel로 대체하려면 어떻게해야합니까?
답변
내가 찾은 가장 좋은 대답은 그때가 주요 인 JPanel를 복사합니다 내가 (JPanelLeft이 버튼을 포함 JPanelRight 버튼이하는 일 포함) 하나의 큰 JPanel의 두 JPanel의를 포함 할 거 하나 JFrame의를 만들 것입니다 각 JButton. 내가 할 것입니다 어떤 버튼을 누르면 (JFrame.getContentPane.removeAll는). 이것은 나를 위해 작동
을 이전 JPanel의 다음 (JFrame.getContentPane.Add (NewJPanel)를 제거하고 내가 원하는대로 내 디자인을 유지합니다. 감사합니다 모든 몸체에 대해
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;
}
});
는 당신의 창에 rootPane
및 switchButton
구성 요소를 추가 한 다음 switchButton
을 클릭하면 패널을 전환합니다.
여기에 tutorial이 있습니다. 주로 JRootPane.setContentPane
에 관심을 가져야하며 튜토리얼의 다른 내용은 적합하지 않습니다.
고맙지 만이 코드가 어떻게 올바른 JPanle을 새로운 것으로 바꿀지를 설명합니다. 모든 Jframe이 하나의 Panel을 포함하는 것을 바꾸고 싶지 않습니다. –
문자 그대로 오른쪽의'JPanel'을'JRootPane'으로 대체하십시오. 'add (rightPanel)'을 호출하면, 대신에'add (rootPane)'을 호출하고,'JFrame'이 아닌'JRootPane'에'setContentPane (rightPanel)'을 호출하면됩니다. 전환하고 싶으면 새로운 패널로'setContentPane'을 호출하십시오. – Brian
왜 JRootPane을 생성하고 있습니까? JFrame (및 JWindow 및 JDialog 및 JInetrnalFrame)에는 이미 JRootPane이 설치되어 있습니까? 이것은 보풀과 혼란을 추가하는 것입니다 ... – MadProgrammer
다음은 설명에 근접해야하는 매우 간단한 예입니다. 왼쪽에는 오른쪽 패널의 내용을 토글하는 포옹 버튼이 있습니다. 오른쪽에는 주어진 테두리와 레이블이있는 패널이 있습니다. 버튼을 누르면 오른쪽의 내용이 다른 패널과 바뀝니다.
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();
}
});
}
}
스레드 "AWT-EventQueue-0"의 예외 java.lang.IllegalArgumentException : 레이아웃에 추가 할 수 없습니다. 제약 조건이 문자열이어야합니다 ... –
@ AbdEl-RahmanEl-Tamawy 제 잘못, JVM7 이전 버전에서 제공해야합니다. CardLayout을 사용하여 컨테이너에 구성 요소를 추가 할 때 "문자열"제약 조건. 포함 된 모든 구성 요소에 대해 모두 다르다면 String을'add' 메소드의 두 번째 인수로 전달할 수 있습니다. –
@ AbdEl-RahmanEl-Tamawy 두 개의 String (문자열) 제약 조건을 추가하여 모든 Java 버전에서 작동하도록했습니다. –
- 1. Java의 JPanel 내부에 JFrame을 표시합니다.
- 2. GridLayout이 포함 된 JPanel로 JDialog를 패킹하려면 어떻게해야합니까?
- 3. JPanel 대 Java의 JFrame
- 4. 2 개의 다른 스레드의 목록 사용 중?
- 5. to_json에서 키를 대체하려면 어떻게해야합니까?
- 6. 숨겨진 필드로 대체하려면 어떻게해야합니까?
- 7. 레일 : 2 개의 인스턴스 변수 또는 하나만보기에서보기에 다른 하나를 생성하고
- 8. jquery에서 특수 클래스를 다른 클래스로 대체하려면 어떻게해야합니까?
- 9. Netbeans의 문자열을 대체하려면 어떻게해야합니까?
- 10. 다른 테이블의 조건 중 하나를 선택하여 2 개의 테이블 항목을 표시하는 SQL 쿼리를 작성하는 방법
- 11. 다른 JPanel 내에서 JPanels를 왼쪽 정렬하는 방법
- 12. JFrame에서 JPanel로 값 전달
- 13. 유효성 검사 속성 MVC 2 - 두 값 중 하나를 확인하십시오.
- 14. 하나의 jpanel에서 다른 jpanel로 jtoolbar를 전송하십시오.
- 15. java의 기본 메소드에 3 개의 다른 문자열을 전달하려고합니다. 어떻게해야합니까?
- 16. PHP의 배열에서 특정 키의 값을 대체하려면 어떻게해야합니까?
- 17. 동일한 객체 하나를 다른 두 개의 다른 활동으로 전달하는 방법
- 18. == 및 = : = 중 하나를 사용해야합니까?
- 19. 패널에서 GWT 위젯을 대체하려면 어떻게해야합니까?
- 20. Java의 setPreferredSize의 크기가 조정되지 않습니다. JPanel
- 21. 두 개의 결과 세트를 결합하고 여전히 열 중 하나를 유지하십시오.
- 22. JPanel을 같은 프로젝트의 다른 클래스에서 다른 JPanel로 업데이트하는 방법은 무엇입니까?
- 23. I가 통과 것을 나는 두 개의 클래스 중 하나를 가지고
- 24. Spring Webflow에서 2 개 이상의 이벤트 중 하나를 반환하는 방법
- 25. Ruby에서 인스턴스 메소드를 올바르게 대체하려면 어떻게해야합니까?
- 26. Java의 JFrame/JPanel/JComponent에 웹 브라우저 추가
- 27. Wordpress 테마를 업로드하고 대체하려면 어떻게해야합니까?
- 28. MyLocationOverlay의 나침반 이미지를 대체하려면 어떻게해야합니까?
- 29. 순차적으로 2 개의 아이비 파일을 호출하는 중
- 30. 2 개의 그림을 잠시 동안 Java의 메모리 게임에서 열어 두십시오.
당신이 지금까지 가지고있는 코드를 게시하십시오. 쉬운 해결책은 JPanel1에서'CardLayout'을 사용하는 것이고, 버튼을 누르면'CardLayout.next() '를 호출 할 수 있습니다. –
Id 현재 디자인이 클라이언트에 더 좋기 때문에 CardLayout을 사용하고 싶습니다. 코드에 관해서는 Netbeans를 드래그 앤 드롭에 사용했습니다. 인터페이스는 두 개의 JPanels 왼쪽에있는 버튼으로 나누어 져 있으며 버튼의 효과가 변경되기를 원합니다. 오른쪽에있는 JPanel을 다른 하나와 함께 사용하십시오. –
어리석은 질문 일 수도 있지만 JPanel JPanelOnLeft 변수를 선언하고 그 값을 변경합니까? 예 : JPanelOnLeft를 JPanelOnLeftInitializationValue로 초기화 한 다음 사용자가 단추를 클릭하여 해당 패널의 내용을 바꿀 때 JPanelOnLeft를 JPanelOnLeftContainingUserRequestedContent로 설정합니다. –