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

使用一个jPanel上的按钮修改另一个jPanel

商鸿哲
2023-03-14

我刚刚接触Java,正在为我的大学班级做一个项目。我正在开发一款百万富翁游戏,但是我被卡住了。

我有一个JFrame类,其中我有2个面板。第一个由按钮组成,第二个是我想通过按下按钮来更改的面板。按钮具有自己的类及其构造函数,面板也是如此,因为它们具有不同的布局。我需要在按钮类中创建一个方法,以从框架中删除第二个面板并添加第三个面板(在另一个更JPanel类中描述)。因此,从技术上讲,我需要从按钮类方法访问我的JFrame类构造函数。有没有办法做到这一点?

我有我的第一个面板类和我的按钮类及其点击通知器方法。现在我需要知道如何在我的 Button 方法中修改我的 JFrame 类,以便在单击时关闭第一个面板,在相同的位置打开另一个面板。

按钮方法

public class ClickListenerD1 implements ActionListener
{
    public void actionPerformed(ActionEvent event)
    {
        buttonPressed();
    }

    private void buttonPressed()
    {
        JPanel panel3 = new Domanda1();
    }
}

主JFrame类

package nuovaPartita;

import java.awt.BorderLayout;
import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Visualizza la finestra di gioco.
 */
public class NuovaPartitaViewer extends JFrame
{
    private static final int FRAME_LUNGH = 1600;
    private static final int FRAME_ALT = 900; 

    JPanel panel1 = new NuovaPartitaComp1();
    JPanel panel2 = new Start();
    /**
     * Costruisce una finestra di gioco su cui vengono visualizzati due 
pannelli.
     */
    public NuovaPartitaViewer()
    {
        setSize(FRAME_LUNGH, FRAME_ALT);
        setTitle("CHI VUOL ESSER MILIONARIO?");
        setVisible(true);
        setLocationRelativeTo(null);
        setResizable(false);

        BorderLayout layout = new BorderLayout();
        getContentPane().setLayout(layout);
        getContentPane().setBackground(Color.BLACK);
        add(panel1, BorderLayout.WEST);
        add(panel2, BorderLayout.CENTER);
    }
}

谢谢

共有1个答案

齐阳
2023-03-14

您只需在按钮的操作侦听器中设置与按钮对应的面板即可。

public class NuovaPartitaViewer extends JFrame {

    public NuovaPartitaViewer() {
        JPanel p1 = new JPanel();
        p1.add(new JLabel("Panel 1"));
        JPanel p2 = new JPanel();
        p2.add(new JLabel("Panel 2"));
        JPanel p3 = new JPanel();
        p3.add(new JLabel("Panel 3"));
        JPanel p4 = new JPanel();
        p4.add(new JLabel("Panel 4"));

        JButton b1 = new JButton("Button 1");
        b1.addActionListener(e -> setPanel(p1));
        JButton b2 = new JButton("Button 2");
        b2.addActionListener(e -> setPanel(p2));
        JButton b3 = new JButton("Button 3");
        b3.addActionListener(e -> setPanel(p3));
        JButton b4 = new JButton("Button 4");
        b4.addActionListener(e -> setPanel(p4));

        JPanel buttonsPanel = new JPanel(new GridLayout(2, 2));
        buttonsPanel.add(b1);
        buttonsPanel.add(b2);
        buttonsPanel.add(b3);
        buttonsPanel.add(b4);

        BorderLayout layout = new BorderLayout();
        getContentPane().setLayout(layout);
        getContentPane().setBackground(Color.BLACK);
        add(buttonsPanel, BorderLayout.WEST);
        add(p1, BorderLayout.CENTER);

        setTitle("CHI VUOL ESSER MILIONARIO?");
        pack();
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    }

    private void setPanel(JPanel p) {
        add(p, BorderLayout.CENTER);
        revalidate();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new NuovaPartitaViewer());
    }
}

如果您的所有按钮都是定制的(扩展了JButton),那么您可以直接在该类中添加动作监听器代码。在构造函数中传递相应的<code>JPanel</code>,以便可以在动作侦听器中使用它。

此外:

  • 不要设置框架的大小,而应改用 pack()
  • 调用集可见(true) 作为您在方法中执行的最后一件事。
 类似资料:
  • 所以假设我有一个“开”和一个“关”按钮。当我按下打开按钮时,我希望打开按钮隐藏自己,关闭按钮显示出来,反之亦然。 一个人怎么能这么做?

  • 问题内容: 我有一个外部面板,在外部面板上有另一个jPanel。 如果我在内部面板上单击鼠标右键,则应该执行外部面板的右键单击操作。如果我确实在内部面板上单击鼠标左键,则应该发生其自身内部面板的点击动作。 是否可以将点击事件从一个面板传递到另一面板? 问题答案: 要解决此问题,您需要解决许多问题。 首先是要了解鼠标事件与创建它的组件有关,尤其是位置信息。单击点是相对于源组件x / y位置的偏移量(

  • 我有两个类和一个文本文件数据库,第一个类中的,我们将其称为自动设置为数据库中的数字。现在,在中,我有一个小的和一个文本字段,当然还有一个按钮,我在文本字段中的值会覆盖数据库中的值,但问题出在这里。第一个类中的标签在运行时不会更新,但如果我重新启动它,它会显示我想要的值。 如何在程序运行时更新它?我尝试在另一个类的中更改标签,但它每次都给我一个。 我怎么解决这个? 我希望这让我更容易理解我的问题。这

  • 问题内容: 当仅使用css将鼠标悬停在另一个类的元素上时,是否可以修改一个类的css? 就像是: 只有“包装器”不在“项目”内部,而是在其他地方。 我真的不想在简单的事情上使用javascript,但是如果必须的话,我该怎么做?这是我失败的尝试: 每个班级只有一个要素。不知道为什么他们在制作模板时不使用ID,但这就是事实,我无法更改。 [编辑] 这是一个菜单。每个菜单元素都有一个不同的类。当您将鼠

  • 我想做的是禁用一个按钮,当我启用另一个按钮时(因此最多可以激活一个按钮),但我对JS的了解非常基础。任何提示都将不胜感激。 Lorem ipsum dolor sit amet,concetetur adipiscing elit。车辆三体间前庭。前庭等扫描电镜。Ut venenatis sagittis孕妇。Nam enim tortor,lacinia pretium dolor sit am

  • 我想在我的基本框架中添加一个带有JPanel的JScrollpane 如果我将带有的直接添加到中,就可以了。但是现在,当我将帧的大小减小到500像素以下时,变得更小,如第二张图片所示。 如何使JScrollPane工作?