簡體   English   中英

無法使CardLayout /按鈕ActionListeners正常工作

[英]Can't get CardLayout/button ActionListeners to Work

我知道這與我的設置方式以及動作偵聽器未正確設置到框架有關,但我只是聽不清它。 如果有人能指出我正確的方向,我將很有義務。 對不起,菜鳥問題。

這是我所擁有的:

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

public class Main implements ActionListener {

    JPanel cardHolder;
    public static final String HOME_CARD = "Home";
    public static final String BLUE_PANEL = "Blue Panel";
    public static final String RED_PANEL = "Red Panel";
    public static final String ORANGE_PANEL = "Orange Panel";

    public static JButton home = new JButton("Home");
    public static JButton bluePanel = new JButton("Blue Card");
    public static JButton redPanel = new JButton("Red Panel");
    public static JButton orangePanel = new JButton("Orange Panel");

    public static JPanel createCardHolderPanel() {
        JPanel cardHolder = new JPanel(new CardLayout());
        cardHolder.setBorder(BorderFactory.createTitledBorder("Card Holder Panel"));

        cardHolder.add(createHomeCard(), HOME_CARD);
        cardHolder.add(createBluePanel(), BLUE_PANEL);
        cardHolder.add(createRedPanel(), RED_PANEL);
        cardHolder.add(createOrangePanel(), ORANGE_PANEL);

        return cardHolder;
    }

    private static JPanel createOrangePanel() {
        JPanel orangePanel = new JPanel();

        orangePanel.setBackground(Color.orange);
        return orangePanel;
    }

    private static Component createRedPanel() {
        JPanel redPanel = new JPanel();

        redPanel.setBackground(Color.red);
        return redPanel;
    }

    private static Component createBluePanel() {
        JPanel bluePanel = new JPanel();

        bluePanel.setBackground(Color.blue);
        return bluePanel;
    }

    private static Component createHomeCard() {
        JPanel homePanel = new JPanel();

        homePanel.setBackground(Color.GRAY);
        return homePanel;
    }

    public static JPanel createButtonPanel() {
        JPanel buttonPanel = new JPanel(new GridLayout(4, 0, 5, 5));
        buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));

        buttonPanel.add(home);
        buttonPanel.add(bluePanel);
        buttonPanel.add(redPanel);
        buttonPanel.add(orangePanel);

        return buttonPanel;
    }

    public static JPanel createContentPane() {
        JPanel contentPane = new JPanel(new BorderLayout());

        contentPane.setBorder(BorderFactory.createTitledBorder("Main Content Pane"));
        contentPane.setBackground(Color.WHITE);
        contentPane.setPreferredSize(new Dimension(499, 288));

        contentPane.add(createButtonPanel(), BorderLayout.WEST);
        contentPane.add(createCardHolderPanel(),BorderLayout.CENTER);

        return contentPane;
    }

    public static JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();

        JMenu file = new JMenu("File");
        JMenu users = new JMenu("Users");
        JMenu options = new JMenu("Options");
        JMenu help = new JMenu("Help");

        menuBar.add(file);
        menuBar.add(users);
        menuBar.add(options);
        menuBar.add(help);

        return menuBar;
    }

    public static void createAndShowGUI() {
        JFrame frame = new JFrame("Simple CardLayout Program");
        frame.setContentPane(createContentPane());
        frame.setJMenuBar(createMenuBar());
        frame.pack();
        frame.setVisible(true);
    }

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

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == home) {
            CardLayout cardLayout = (CardLayout) (cardHolder.getLayout());
            cardLayout.show(cardHolder, HOME_CARD);
        }

        if (e.getSource() == bluePanel) {
            CardLayout cardLayout = (CardLayout) (cardHolder.getLayout());
            cardLayout.show(cardHolder, BLUE_PANEL);
        }

        if (e.getSource() == redPanel) {
            CardLayout cardLayout = (CardLayout) (cardHolder.getLayout());
            cardLayout.show(cardHolder, RED_PANEL);
        }

        if (e.getSource() == orangePanel) {
            CardLayout cardLayout = (CardLayout) (cardHolder.getLayout());
            cardLayout.show(cardHolder, ORANGE_PANEL);
        }
    }
}

其他人則建議聽按鈕。 此外:

  • 優先考慮與使用情況保持一致的最低可訪問性,例如private而不是public
  • 不要使一切static
  • 對於整個類中使用的不可變常量,請使用static
  • 使用類變量而不是靜態成員作為內容。
  • 不要重復自己,例如,在actionPerformed)()只初始化一次cardLayout
  • 對每種顏色使用參數而不是單獨的方法,例如

     private JPanel createColorPanel(Color color) {...} 

修改后的代碼:

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

public class Main implements ActionListener {

    private static final String HOME_CARD = "Home";
    private static final String BLUE_PANEL = "Blue Panel";
    private static final String RED_PANEL = "Red Panel";
    private static final String ORANGE_PANEL = "Orange Panel";
    private JPanel cardHolder;
    private JButton homeButton = new JButton("Home");
    private JButton blueButton = new JButton("Blue Card");
    private JButton redButton = new JButton("Red Panel");
    private JButton orangeButton = new JButton("Orange Panel");

    public JPanel createCardHolderPanel() {
        cardHolder = new JPanel(new CardLayout());
        cardHolder.setBorder(BorderFactory.createTitledBorder("Card Holder Panel"));
        cardHolder.add(createColorPanel(Color.gray), HOME_CARD);
        cardHolder.add(createColorPanel(Color.blue), BLUE_PANEL);
        cardHolder.add(createColorPanel(Color.red), RED_PANEL);
        cardHolder.add(createColorPanel(Color.orange), ORANGE_PANEL);

        return cardHolder;
    }

    private JPanel createColorPanel(Color color) {
        JPanel panel = new JPanel();
        panel.setBackground(color);
        return panel;
    }

    public JPanel createButtonPanel() {
        JPanel buttonPanel = new JPanel(new GridLayout(4, 0, 5, 5));
        buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel"));
        buttonPanel.add(homeButton);
        buttonPanel.add(blueButton);
        buttonPanel.add(redButton);
        buttonPanel.add(orangeButton);
        homeButton.addActionListener(this);
        blueButton.addActionListener(this);
        redButton.addActionListener(this);
        orangeButton.addActionListener(this);
        return buttonPanel;
    }

    public JPanel createContentPane() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.setBorder(BorderFactory.createTitledBorder("Main Content Pane"));
        panel.setBackground(Color.WHITE);
        panel.setPreferredSize(new Dimension(499, 288));
        panel.add(createButtonPanel(), BorderLayout.WEST);
        panel.add(createCardHolderPanel(), BorderLayout.CENTER);
        return panel;
    }

    public JMenuBar createMenuBar() {
        JMenuBar menuBar = new JMenuBar();
        JMenu file = new JMenu("File");
        JMenu users = new JMenu("Users");
        JMenu options = new JMenu("Options");
        JMenu help = new JMenu("Help");
        menuBar.add(file);
        menuBar.add(users);
        menuBar.add(options);
        menuBar.add(help);
        return menuBar;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        CardLayout cardLayout = (CardLayout) (cardHolder.getLayout());
        if (e.getSource() == homeButton) {
            cardLayout.show(cardHolder, HOME_CARD);
        }
        if (e.getSource() == blueButton) {
            cardLayout.show(cardHolder, BLUE_PANEL);
        }
        if (e.getSource() == redButton) {
            cardLayout.show(cardHolder, RED_PANEL);
        }
        if (e.getSource() == orangeButton) {
            cardLayout.show(cardHolder, ORANGE_PANEL);
        }
    }

    public static void createAndShowGUI() {
        JFrame frame = new JFrame("Simple CardLayout Program");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Main main = new Main();
        frame.setJMenuBar(main.createMenuBar());
        frame.add(main.createContentPane());
        frame.pack();
        frame.setVisible(true);
    }

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

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

您尚未為任何按鈕設置動作偵聽器。 實現接口的actionPerformed方法不會自動為按鈕設置操作偵聽器。 您必須調用addActionListener方法,因為您的類實現了ActionListener接口,因此在您的情況下,它應類似於以下內容。

public static JButton home = new JButton("Home").addActionListener(this); 
public static JButton bluePanel = new JButton("Blue Card").addActionListener(this); 
public static JButton redPanel = new JButton("Red Panel").addActionListener(this); 
public static JButton orangePanel = new JButton("Orange Panel").addActionListener(this); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM