:
이합니다 (
this
객체가
JFrame
를 확장하는 클래스이다)처럼 전환에 대한 나의 방법은 보인다
한 JPanel을 다른 위치의 JPanel로 어떻게 바꿀 수 있습니까?
매우 쉽게 :이 도구는이 상황을 위해 만들어진 도구이므로 CardLayout을 사용하십시오.
다음과 같은 상수가 있다면 :
public static final String INTRO_PANEL = "intro panel";
public static final String QUESTION_PANEL = "question panel";
을 한 다음에 JPanel의 교환 수 있도록
mainPanel.setLayout(cardLayout);
mainPanel.add(introPanel, INTRO_PANEL);
mainPanel.add(questionPanel, QUESTION_PANEL);
cardLayout.show(mainPanel, INTRO_PANEL);
처럼 JPanel의의의를 추가 :
cardLayout.show(mainPanel, QUESTION_PANEL);
될 것이라고했다 모든 것을 QUESTION_PANEL이 que를 추가 할 때 사용 된 String 상수라고 가정하고 스왑을 표시하는 데 필요합니다. stionPanel을 mainPanel에 연결하고 mainPanel이 CardLayout을 사용하는 지 확인합니다. 예를 들어
: 모든의 validate 메소드를 실행해야하는 제거 방법 후
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.*;
public class SwapPanels extends JPanel {
public static final String INTRO_PANEL = "intro panel";
public static final String QUESTION_PANEL = "question panel";
private static final int PREF_W = 500;
private static final int PREF_H = 400;
private CardLayout cardLayout = new CardLayout();
private JPanel introPanel;
private JPanel questionPanel;
private Random random = new Random();
public SwapPanels() {
introPanel = createPanel("Introduction");
questionPanel = createPanel("Question");
setLayout(cardLayout);
add(introPanel, INTRO_PANEL);
add(questionPanel, QUESTION_PANEL);
int delay = 3 * 1000; // show intro for 3 seconds
new Timer(delay, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(SwapPanels.this, QUESTION_PANEL);
((Timer) e.getSource()).stop();
}
}).start();
}
private JPanel createPanel(String title) {
int rgb = random.nextInt();
Color color = new Color(rgb);
JPanel panel = new JPanel(new GridBagLayout());
panel.setBorder(BorderFactory.createLineBorder(color, 60));
panel.add(new JLabel(title));
return panel;
}
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
private static void createAndShowGui() {
SwapPanels mainPanel = new SwapPanels();
JFrame frame = new JFrame("SwapPanels");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
이것은 매우 흥미 롭습니다. 그리고 나는 그것을 테스트했고 실제로 작동합니다. 내 유일한 문제는 MiG 레이아웃을 사용하고 있다는 것입니다. 테스트를 위해 메인 패널에서 레이아웃을 제거했지만 완료 한 레이아웃을 다시해야합니다. 'CardLayout'으로 바꾸고 싶은 패널을 포장 한 다음 MiG를 사용하는 커스텀 패널을 추가 할 수 있을까요? – eignhpants
@eignhpants : MigLayout 사용에는 아무런 문제가 없습니다. JPanel을 각각의 레이아웃을 사용하여 중첩하는 것이 일반적입니다. CardLayout을 사용하는 하나의 JPanel이 필요합니다. 즉, 스왑 된 구성 요소를 보유 할 것입니다. –