当前位置: 首页 > 知识库问答 >
问题:

在CardLayout中设置面板布局

阴波峻
2023-03-14

我试图创建一个假想的车辆,有自动和手动模式的用户界面。当用户将车辆设置为其中一种模式时,它应该只显示与该模式相关的控件,我已经使用CardLayout完成了这一点。

然而,我也希望能够为每张卡片手动指定布局中各种元素的位置——对于静态布局,我会按照mainPanel的思路做一些事情。setLayout(null),但在CardLayout上使用时,这只会给出一个空白窗口(因此下面代码中有两行注释掉)。

我如何实现这两个目标?我目前的代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class UI extends JFrame implements ActionListener{

public UI() {
    initUI();
}

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

public final void initUI() {

    cardPanel = new JPanel();
    cardPanel.setLayout(cardLayout);

    JPanel manualPanel = new JPanel();
    getContentPane().add(manualPanel);
    //manualPanel.setLayout(null);
    cardPanel.add(manualPanel, "manual");

    JPanel autoPanel = new JPanel();
    //autoPanel.setLayout(null);
    cardPanel.add(autoPanel, "auto");

    JButton startButton = new JButton("START/STOP");
    startButton.setBounds(50, 150, 200, 50);
    startButton.addActionListener(new startListener());
    manualPanel.add(startButton);
    autoPanel.add(startButton);

    JButton autoButton = new JButton("SWITCH TO AUTO");
    autoButton.setBounds(50, 250, 200, 50);
    autoButton.addActionListener(new autoListener());
    manualPanel.add(autoButton);

    JButton upButton = new JButton("^");
    upButton.setBounds(125, 320, 50, 50);
    upButton.addActionListener(new returnListener());
    manualPanel.add(upButton);

    JButton downButton = new JButton("\\/");
    downButton.setBounds(125, 380, 50, 50);
    downButton.addActionListener(new returnListener());
    manualPanel.add(downButton);

    JButton ccwButton = new JButton("<-");
    ccwButton.setBounds(55, 350, 50, 50);
    ccwButton.addActionListener(new returnListener());
    manualPanel.add(ccwButton);

    JButton cwButton = new JButton("->");
    cwButton.setBounds(195, 350, 50, 50);
    cwButton.addActionListener(new returnListener());
    manualPanel.add(cwButton);

    JButton ngzButton = new JButton("SOMETHING ELSE");
    ngzButton.setBounds(50, 450, 200, 50);
    ngzButton.addActionListener(new returnListener());
    manualPanel.add(ngzButton);

    JButton manualButton = new JButton("SWITCH TO MANUAL");
    manualButton.setBounds(50, 250, 200, 50);
    manualButton.addActionListener(new manualListener());
    autoPanel.add(manualButton);

    JButton returnButton = new JButton("SOMETHING ELSE");
    returnButton.setBounds(50, 350, 200, 50);
    returnButton.addActionListener(new returnListener());
    autoPanel.add(returnButton);

    setTitle("UI");
    setSize(800, 600);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    add(cardPanel, BorderLayout.NORTH);
}

public static void main(String[] args) {

    UI ui = new UI();
    ui.setVisible(true);
}

public void actionPerformed(ActionEvent e){
}

private class returnListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
    }
}

private class autoListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        cardLayout.show(cardPanel, "auto");
    }
}

private class startListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
    }
}

private class manualListener implements ActionListener {
    public void actionPerformed (ActionEvent event) {
        cardLayout.show(cardPanel, "manual");
    }
}


}

共有1个答案

巫马刚洁
2023-03-14

在您的示例中,您创建了一个开始按钮,但随后尝试将同一实例添加到两个不同的面板中。因为一个组件只能占用一个容器,所以需要创建两个按钮,每个面板一个。

另一方面,不要使用null布局,而是为每个面板指定BorderLayout,将按钮添加到具有默认FlowLayoutJPanel,并将按钮面板添加到SOUTH。然后,您可以使用任何合适的布局将插图嵌套在中心

附录:正如@Frakool评论的那样,使用布局将改善按钮的跨平台外观。在封闭的窗口上调用pack(),并在嵌套的插图面板上覆盖getPreferredsize(),以提供所需的大小。在此相关示例中,CENTER面板仅用于绘图;如果没有组件,其布局将变得无关紧要。

 类似资料:
  • 在我的项目中,我试图为管理员创建一个部分。下列的http://philsturgeon.co.uk/blog/2009/07/Create-an-Admin-panel-with-CodeIgniter#top 我试了第二种方法。根据它,我的文件夹结构更改为类似这样。 我已经创建了一个控制器索引。php内置控制器/admin,代码如下: 和内部视图/管理我已经创建了一个文件index.php并呼应

  • 问题内容: 我试图用来显示两个,一个主菜单和一个控件屏幕。当我将两张卡片添加到卡中时,它只会显示两张闪烁的图像。这是我的代码: MazeGamePanel: 公共类MazeGamePanel扩展了JPanel实现Runnable { } MazeControlsPanel: 包装屏幕; 问题答案: 这是一个问题: 不要在Swing程序中使用java.util.Timer,因为您会遇到线程问题。而是

  • 注意:在 Photoshop CS6 中,3D 功能是 Photoshop Extended 的一部分。Photoshop Extended 中的所有功能是 Photoshop 的一部分。Photoshop 不提供单独的 Extended 版本。 3D 面板概述 选择 3D 图层后,3D 面板会显示关联的 3D 文件的组件。在面板顶部列出文件中的网格、材质和光源。面板的底部显示在顶部选定的 3D

  • Photoshop 中的 Photoshop 3D 面板可助您轻松处理 3D 对象。3D 面板效仿“图层”面板,被构建为具有根对象和子对象的场景图/树。 您可以通过以下几种方式与场景图中的 3D 对象交互,例如: 删除对象 重新排序对象 反转对象的顺序 插入对象 复制对象 创建对象实例 分组对象 您可以从与 3D 对象关联的上下文菜单访问这些交互。右键单击 (Windows) 或按住 Contro

  • 在我的程序中,我有一个基于向导的布局。由CardLayout实现。因此,有一组类扩展了JPanel。我想在每个面板上都有按钮来导航到其他面板。例如,当程序显示第一面板时,我想有一个按钮来显示第二面板。 我试图在main cardlayout panel holder中创建一个方法,以便任何其他类都可以通过该方法更改显示面板,但它不起作用,并且出现了stackoverflow错误。 这是我的课程 基

  • 注意:  Typekit 现已更名为 Adobe Fonts,包含在 Creative Cloud 和其他订阅中。了解详情。 After Effects 提供了各种创意选项,用于文本的格式化和自定义。使用“字符”面板设置字符格式。如果选择了文本,您在“字符”面板中所做的更改仅影响选定文本。如果没有选择文本,您在“字符”面板中所做的更改将影响所选文本图层和文本图层的选定源文本关键帧(如果存在)。如果