当前位置: 首页 > 面试题库 >

Java中的CardLayout通过“卡片”之一中的操作进行更改

鲜于峰
2023-03-14
问题内容

我正在使用制作一个简单的游戏JFrame。我制作了一个简单的“开始”屏幕,该屏幕主要由a
String和a组成JButton。我正在使用该actionPerformed(ActionEvent e)方法单击按钮。我不知道如何通过单击按钮来更改卡。这看起来似乎是一个很简单的问题,但随之而来的是:游戏的主JFrame,StartScreen和JPanel都位于单独的文件中。我的主文件Virus.java是创建该文件的位置JFrame。我的文件VirusGamePanel.java是进行游戏的地方。我的文件StartScreen.java是带有按钮的屏幕。当玩家单击按钮时,我想将“纸牌”更改为游戏屏幕。我怎样才能做到这一点?我的StartScreen.java文件:

package virus;

import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.CardLayout;




public class StartScreen extends JPanel implements ActionListener{
    private static final long serialVersionUID = 1L;
    JButton start = new JButton("Start");
    public StartScreen(){
        start.addActionListener(this);
        start.setBounds(new Rectangle(400,300,100,30));
        this.add(start);
    }
    public void paint(Graphics g){
        super.paint(g);
        g.setFont(new Font("Impact",Font.BOLD,72));
        g.setColor(Color.MAGENTA);
        g.drawString("Virus",275,300);
    }
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==start)
        {
            //what to do here?
        }
    }
}

我的Virus.java文件:

package virus;

import javax.swing.*;
import java.awt.CardLayout;
import virus.StartScreen;

public class Virus extends JFrame{
    private static final long serialVersionUID =1L;
    JFrame jf = new JFrame("Virus");
    static JPanel thegame = new JPanel(new CardLayout());
    JPanel game = new VirusGamePanel();
    JPanel start = new StartScreen();

    public Virus(){
        jf.setResizable(false);
        jf.setSize(600,600);
        jf.setLocationRelativeTo(null);
        jf.setDefaultCloseOperation(EXIT_ON_CLOSE);
        jf.setVisible(true);
        jf.add(thegame);
        thegame.add(start);
        thegame.add(game);

    }

    public static void main(String[] args) {
        new Virus();

    }

}

问题答案:

您只需在您的actionPerformed(...)方法中对此进行纠正:

public void actionPerformed(ActionEvent e)
{
    if(e.getSource()==start)
    {
        //what to do here?
        CardLayout cardLayout = (CardLayout) Virus.thegame.getLayout();
        cardLayout.next(Virus.thegame);
    }
}

正如@kleopatra(皇后乐队)本人所指出的那样,请不要替代paint()您在paintComponent(Graphics g)any方法中的绘画内容JPanel/JComponent。而且,JFrame一旦实现大小,首先将组件添加到您的中,然后仅将其设置为Visible,而不是在此之前。而不是为JFrame简单地覆盖JPanel的方法设置大小,而是getPreferredSize()使其返回一些有效的DimensionObject。

下次观看代码时,请注意以下顺序:

public Virus(){
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setResizable(false);                               
    thegame.add(start);
    thegame.add(game);
    jf.add(thegame);        
    jf.pack();
    jf.setLocationRelativeTo(null);
    jf.setVisible(true);
}

这是您的完整代码:

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionListener;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.CardLayout;

public class Virus extends JFrame{
    private static final long serialVersionUID =1L;
    JFrame jf = new JFrame("Virus");
    static JPanel thegame = new JPanel(new CardLayout());
    JPanel game = new VirusGamePanel();
    JPanel start = new StartScreen();

    public Virus(){
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setResizable(false);                               
        thegame.add(start);
        thegame.add(game);
        jf.add(thegame);        
        jf.pack();
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
    }

    public static void main(String[] args) {
        new Virus();

    }

}

class StartScreen extends JPanel implements ActionListener{
    private static final long serialVersionUID = 1L;
    JButton start = new JButton("Start");
    public StartScreen(){
        start.addActionListener(this);
        start.setBounds(new Rectangle(400,300,100,30));
        this.add(start);
    }

    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setFont(new Font("Impact",Font.BOLD,72));
        g.setColor(Color.MAGENTA);
        g.drawString("Virus",275,300);
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(600, 600));
    }

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource()==start)
        {
            //what to do here?
            CardLayout cardLayout = (CardLayout) Virus.thegame.getLayout();
            cardLayout.next(Virus.thegame);
        }
    }
}

class VirusGamePanel extends JPanel
{
    public VirusGamePanel()
    {
        JLabel label = new JLabel("I am ON", JLabel.CENTER);
        add(label);
    }

    @Override
    public Dimension getPreferredSize()
    {
        return (new Dimension(600, 600));
    }
}


 类似资料:
  • 问题内容: 是否可以在Java的CardLayout中获得顶级卡片?我尝试遍历每个组件以使用isVisible()检查可见性,但似乎它们都是“可见的”。 编辑:“顶卡”是指当前显示在“顶卡”上的那张,而不是第一张或最后一张卡。另外,我不知道它是否有帮助,但我正在寻找一个JPanel(或其子类) 编辑:代码段 上面的代码总是打印出每个组件类的名称,无论它们是否是可见的卡片。 编辑 :我正在使用它作为

  • 问题内容: 我看了一个使用此代码的代码示例: 但是,当我使用Eclipse时,我收到一条消息,提示它已过时,我想知道是否还有另一种方法可以在单击按钮时在CardLayout中显示不同的卡片?下面是我的CardLayout类的代码。如果代码的某些部分不正确,也可以提出建议。谢谢! 问题答案: 我看不到Java7 show(容器父代,字符串名称)或Java6 show(容器父代,字符串名称)已过时 如

  • 使用一个JTabbedPane,我想捕捉一个新选项卡的选择发生变化之前的瞬间,并执行一个操作。这类似于swing组件的焦点丢失事件。其目的是在选项卡更改时将几个JTextFields的文本保存到外部文件中,因此每次用户单击不同的选项卡时,当前选项卡的值都会写入外部文件。 我一直在使用ChangeListener来跟踪选项卡的更改,但还没有找到一种方法来完成我需要的操作。在下一个简单的例子中有什么想

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

  • 问题内容: 我需要检测Java中的操作系统名称和版本。我可以做到的 但是问题在于这是不可靠的。有时它返回错误的信息,并且我无法检测到所有操作系统,除了最流行的Windows,MacOS,Linux等,在64位操作系统的情况下,甚至会提供错误的信息。我需要检测具有任何规格的任何操作系统。我无法为此找到合适的解决方案。 也许我可以用JavaScript做到这一点?如果在Java中是不可能的,请告诉我如

  • 问题内容: 我正在开发客户端-服务器软件,其中客户端按如下方式连接到数据库服务器。 这两个应用程序始终位于同一本地网络上。我的问题是本地网络使用代理时,在这种情况下,MySQL连接失败。 当本地网络上的代理服务器时,如何与Java编程语言(MySQL数据库)建立连接? 谢谢您的帮助。问候! 问题答案: 尝试使用和系统属性。看看这里的一章“2.4)SOCKS”和这里。(http.proxyHost不