麻烦在cardlayout的面板上添加组件,它们看起来很奇怪(非常小和顶部中心),尝试了很多布局但没有得到合适的结果,我必须放置,按钮,分割窗格,选项卡窗格在不同的面板上 这是示例代码。在我现在正在使用的代码上遇到同样的问题
请查看我出错的地方
public static void main(String[] args) {
CardLayout cards = new CardLayout();
JPanel cardPanel = new JPanel();
cardPanel.setLayout(cards);
JFrame guiFrame = new JFrame();
//make sure the program exits when the frame closes
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Frame");
guiFrame.setSize(528, 555);
//This will center the JFrame in the middle of the screen
guiFrame.setLocationRelativeTo(null);
guiFrame.setVisible(true);
JButton B_1 = new JButton("");
JButton B_2 = new JButton("");
JPanel firstCard = new JPanel();
firstCard.add(B_1);
B_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
cards.next(cardPanel);
}
});
JPanel secondCard = new JPanel();
secondCard.add(B_2);
B_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
cards.previous(cardPanel);
}
});
cardPanel.add(firstCard);
cardPanel.add(secondCard);
guiFrame.add(cardPanel);
}
}
答案 0 :(得分:2)
您的代码甚至无法编译。
我重新安排了您的代码并添加了以下功能:
我通过调用SwingUtilities invokeLater启动了GUI。这将Swing GUI置于Event Dispatch thread(EDT)。
我把代码放在一起(JFrame,JPanel),以便代码更容易理解。
我在每个卡片面板上放了一个JLabel,这样你就可以看到哪个面板是哪个。
我把文字放在JButtons中。它们非常小,因为您没有要显示的按钮的文字或标签。
我将部分JFrame代码移到了方法的末尾。您在Swing GUI中执行的最后一项操作是将框架设置为可见。在使JFrame窗口可见之前,必须构造所有Swing组件。
这是您尝试编码的卡片布局的经过测试的最小例子。
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class CardLayoutTest implements Runnable {
@Override
public void run() {
JFrame guiFrame = new JFrame();
// make sure the program exits when the frame closes
guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
guiFrame.setTitle("Frame");
final CardLayout cards = new CardLayout();
final JPanel cardPanel = new JPanel();
cardPanel.setLayout(cards);
final JPanel firstCard = new JPanel();
firstCard.setLayout(new FlowLayout());
JLabel label1 = new JLabel("Panel 1");
firstCard.add(label1);
JButton b_1 = new JButton("Swap to Panel 2");
firstCard.add(b_1);
final JPanel secondCard = new JPanel();
secondCard.setLayout(new FlowLayout());
JLabel label2 = new JLabel("Panel 2");
secondCard.add(label2);
JButton b_2 = new JButton("Swap to Panel 1");
secondCard.add(b_2);
b_1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
cards.next(cardPanel);
}
});
b_2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event) {
cards.previous(cardPanel);
}
});
cardPanel.add(firstCard, "First Panel");
cardPanel.add(secondCard, "Second Panel");
guiFrame.add(cardPanel);
guiFrame.setSize(528, 555);
// This will center the JFrame in the middle of the screen
guiFrame.setLocationRelativeTo(null);
guiFrame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new CardLayoutTest());
}
}
答案 1 :(得分:1)
这就是CarLayout
的工作方式,默认情况下,它将对象置于水平中心和垂直顶部。如果未指定添加组件的大小,则会将其调整为可能的最小大小。
配置布局对齐,设置组件的大小或使用其他布局。