如何将CardLayout与多个JButton一起使用?

时间:2015-11-18 15:54:51

标签: java swing

我需要创建一个GUI,询问用户的详细信息,然后将其保存在链接列表中。我想使用CardLayout从一帧切换到另一帧,这是我第一次做的事情。我做的事情可能少了一半我需要做的事情,在这里我很遗憾。下面的代码编译并执行,但是当我单击按钮时,不会发生所需的更改。可能有什么不对?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class MyDatabaseWindow extends JPanel{
public static final String FRONT_PAGE = "Front Page";
public static final String BROWSE_MEMORIES = "Browse Memories";
public static final String ADD_EDIT = "Add Edit";
public static final String VIEW_MEMORY = "View Memory";

public static void createAndShowGUI() {
    final MyDatabaseWindow mdbw = new MyDatabaseWindow();

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(null);
    final JButton addButton = new JButton("Add");
    final JButton editButton = new JButton("Edit");
    final JButton deleteButton = new JButton("Delete");
    final JButton browseButton = new JButton("Browse");
    final JButton searchButton = new JButton("Search");

    addButton.setBounds(100, 400, 100, 100);
    editButton.setBounds(200, 400, 100, 100);
    deleteButton.setBounds(300, 400, 100, 100);
    browseButton.setBounds(400, 400, 100, 100);
    searchButton.setBounds(500, 400, 100, 100);

    buttonPanel.add(addButton);
    buttonPanel.add(editButton);
    buttonPanel.add(deleteButton);
    buttonPanel.add(browseButton);
    buttonPanel.add(searchButton);

    addButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            mdbw.goToAddPage();
        }
    });
    editButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            mdbw.goToBrowse();
        }
    });
    deleteButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            mdbw.goToBrowse();
        }
    });
    browseButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            mdbw.goToBrowse();
        }
    });
    searchButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            mdbw.goToSearch();
        }
    });

    JFrame frame = new JFrame("Memory Files");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(700, 540);
    frame.setLocation(250, 100);
    frame.getContentPane().add(mdbw);
    frame.getContentPane().add(buttonPanel);
    frame.setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

private CardLayout cardLayout = new CardLayout();
private JPanel cardShowingPanel = new JPanel(cardLayout);

public MyDatabaseWindow() {
    Window1 win1 = new Window1();
    cardShowingPanel.add(win1, FRONT_PAGE);
    Window2 win2 = new Window2();
    cardShowingPanel.add(win2, BROWSE_MEMORIES);
    Window3 win3 = new Window3();
    cardShowingPanel.add(win3, ADD_EDIT);
    Window4 win4 = new Window4();
    cardShowingPanel.add(win4, VIEW_MEMORY);

    setLayout(new BorderLayout());
    add(cardShowingPanel, BorderLayout.NORTH);
}

public void goToAddPage() {
    cardLayout.first(cardShowingPanel);
}
public void goToBrowse() {
    cardLayout.first(cardShowingPanel);
    cardLayout.next(cardShowingPanel);
}
public void goToSearch() {
    cardLayout.last(cardShowingPanel);
}
public void showCard(String key) {
    cardLayout.show(cardShowingPanel, key);
}
}

class Window1 extends JPanel {
public Window1() {
    init();
}

private void init() { //dummy details
    JLabel title = new JLabel("Memory Files");
    title.setBounds(0, 0, 500, 500);
    add(title);
}
}
class Window2 extends JPanel {

public Window2() {
    init();
}
private void init() { //dummy details
    JLabel title = new JLabel("Memory Files");
    title.setBounds(0, 0, 500, 500);
    add(title);
}
}
class Window3 extends JPanel {

public Window3() {
    init();
}
private void init() {//dummy details
    JLabel title = new JLabel("Memory Files");
    title.setBounds(0, 0, 500, 500);
    add(title);
}
}
class Window4 extends JPanel {

    public Window4() {
        init();
    }
    private void init() {//dummy details
        JLabel title = new JLabel("Memory Files");
        title.setBounds(0, 0, 500, 500);
        add(title);
    }
}

1 个答案:

答案 0 :(得分:2)

主要问题是使用null-layouts和这些代码行:

frame.getContentPane().add(mdbw);
frame.getContentPane().add(buttonPanel);

首先,您使用CardLayout将面板添加到BorderLayout.CENTER,然后覆盖"覆盖"使用您的buttonPanel,它使用null-layout。

我会为FlowLayout添加一个简单的JPanelbuttonPanel的默认布局管理器)并将其添加到{{1}的BorderLayout.SOUTH }}。我还强烈建议您阅读this tutorial

请删除以下代码行:

contentPane

并将buttonPanel.setLayout(null); ... addButton.setBounds(100, 400, 100, 100); editButton.setBounds(200, 400, 100, 100); deleteButton.setBounds(300, 400, 100, 100); browseButton.setBounds(400, 400, 100, 100); searchButton.setBounds(500, 400, 100, 100); 更改为frame.getContentPane().add(buttonPanel);

还要忘记frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH); - 类中的null-layout / setBounds()

(请注意,如果按一个按钮,您仍然不会看到文本更改,因为您总是添加Window相同的文本(" Memory Files")到你的JLabel。)