我正在使用制作一个简单的游戏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()
使其返回一些有效的Dimension
Object。
下次观看代码时,请注意以下顺序:
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不