首页 > 解决方案 > 如何使用 ActionListener 从按钮调用面板

问题描述

所以我正在制作一个从面板跳转到面板的简单程序,并使用动作监听器按钮进行跳转。我使用什么样的方法或操作从面板跳转到面板?

我尝试使用 setVisible(true); 在动作侦听器下,但我得到的只是一个空白屏幕。尝试使用 setContentPane(differentPanel); 但这不起作用。

ackage Com.conebind.Characters;
import Com.conebind.Tech.TechA16;
import Com.conebind.Overviews.OverviewA16;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Char_A16 extends JFrame {

    private JButton combosButton16;
    private JButton techButton16;
    private JButton overviewButton16;
    private JLabel Image16;
    private JPanel panel16;
    private JPanel panelOverviewA16;
    public Char_A16() {
        overviewButton16.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                OverviewA16 overview16 = new OverviewA16();
             overview16.setVisible(true);
             overview16.pack();
             overview16.setContentPane(new Char_A16().panelOverviewA16);
            }
        });
        techButton16.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                //Todo
            }
        });

        }

    private void createUIComponents(){

        Image16 = new JLabel(new ImageIcon("Android 16.png"));
    }
    public static void main (String[] args){
        JFrame frame = new JFrame("Android 16");
        frame.setContentPane(new Char_A16().panel16);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);}
}

setContentPane(OverviewA16) 不起作用,因为没有定义面板的对象。

标签: javaintellij-idea

解决方案


请查看这个演示项目,展示如何将 CardLayout 与 IntelliJ IDEA GUI Designer 一起使用。

卡片布局 1

卡片布局 2

主窗体有一个在其中显示的 2 个窗体之间切换的方法:

  public void showPanel(String id) {
    final CardLayout cl = (CardLayout) cardPanel.getLayout();
    cl.show(cardPanel, id);
  }

在主表单初始化期间,这两种表单都添加到卡片布局中:

FormOne one = new FormOne();
one.setParentForm(this);
cardPanel.add(one.getPanel(), FORM_ONE);
FormTwo two = new FormTwo();
two.setParentForm(this);
cardPanel.add(two.getPanel(), FORM_TWO);
final CardLayout cl = (CardLayout) cardPanel.getLayout();
cl.show(cardPanel, FORM_ONE);

对主父表单的引用使用方法传递给这两个表单,setParentForm()以便FormOneFormTwo可以访问.showPanel()MainForm

在更基本的情况下,您可能有一个按钮或其他一些控件来切换直接位于 上的表单MainForm,然后您可能不需要将主表单引用传递给子表单,但根据您的应用程序逻辑,它仍然很有用。


推荐阅读