我有一个带有多个面板的JFrame类,我通过使用paintComponent(graphics g)方法绘制所有的图形,因此使用CardLayout没有任何用处。要切换帧,我只需点击一个按钮,比如回车,但问题是,当我切换面板时,paintCompenent中剩下的图形仍然存在。我还尝试使用panel.setvisible(false)使面板可见,这有点帮助,只是我要转换到的面板仍然不可见,即使在将visible设置为true之后。新面板的按钮和命令工作并转换回第一个面板,所以我知道转换正在工作,只是没有显示我想要的方式。下面是交互的2个面板和处理它们的JFrame类的代码:
//JFRAME CLASS
package main;
import gameStates.Instruction;
import gameStates.Menu;
import gameStates.State;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class GameFrame extends JFrame implements KeyListener{
//panels for Game States in order:
static ArrayList<State> panels = new ArrayList<State>();//holds all of the game states that the game will eventually reach
private static int currentState=0;//STATES: 0 - Menu
//1 - Instruction
//2 - Level 1 and States 3 through 7 are the levels up one respectively up to level 6
public GameFrame() {
panels.add(new Menu(this));
panels.add(new Instruction(this));
addKeyListener(this);
setSize(640,480);
setPreferredSize(new Dimension(640,480));
setResizable(false);
setLocation(20,50);
setName("FBLA: A Success Story");
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(panels.get(1));
add(panels.get(0));
panels.get(1).setVisible(false);
panels.get(0).setVisible(true);
pack();
setVisible(true);
}
@SuppressWarnings("unused")
public static void main(String[] args) {
GameFrame g = new GameFrame();
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ESCAPE)
System.exit(0);
else {
panels.get(currentState).buttons(e);
}
}
public void keyReleased(KeyEvent e) {
}
public void nextState(int state) {
panels.get(currentState).setVisible(false);
panels.get(state).setVisible(true);
currentState = state;
}
}
//////////////////////INITIAL PANEL//////////////////////////
package gameStates;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.Timer;
import main.GameFrame;
@SuppressWarnings("serial")
public class Menu extends State {
//general items
public BufferedImage bg;
public String[] options = new String[3];
public double x, y, velX, velY;
public int selected;
public Graphics2D g2;
//time stuff
Timer t = new Timer(5,this);
public Menu(GameFrame g) {
super(g);
setup();
}
public void setup() {
try {
bg = ImageIO.read(Menu.class.getResourceAsStream("/backgrounds/FBLAmenubg.gif"));
}
catch (Exception e) {
e.printStackTrace();
}
options[0] = "PLAY";
options[1] = "INSTRUCTIONS";
options[2] = "QUIT";
selected = 0;
x=y=velY=0;
velX=-.1;
t.start();
}
public void paintComponent(Graphics g) {
g2 = (Graphics2D)g;
g2.drawImage(bg, (int)x, (int)y, null);
g2.drawImage(bg, (int)x + 640, (int)y, null);
Font f = new Font("FreeSerif", Font.ROMAN_BASELINE, 48);
g2.setFont(f);
g2.setColor(Color.WHITE);
for(int j=0;j<3;j++){
if(selected == j)
g2.setColor(Color.RED);
g2.drawString(options[j], 120, 80 + j*48);
g2.setColor(Color.WHITE);
}
}
private void processSelection() {
if(selected == 2)
System.exit(0);
else if (selected == 1) {
parent.nextState(1);
}
else {
}
}
public void buttons(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_DOWN) {
selected++;
if(selected == 3)
selected=0;
}
if(e.getKeyCode() == KeyEvent.VK_UP) {
selected--;
if(selected == -1)
selected=2;
}
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
processSelection();
}
}
public void actionPerformed(ActionEvent e) {
x += velX;
if(x<=-640)
x=0;;
repaint();
}
}
/////////////////////TRANSITION TO THIS PANEL////////////////////////////
package gameStates;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.Timer;
import main.GameFrame;
@SuppressWarnings("serial")
public class Instruction extends State{
public BufferedImage bg;
public Graphics2D g2;
public Timer t;
public Instruction(GameFrame g) {
super(g);
setup();
}
public void buttons(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_SPACE)
parent.nextState(0);
}
public void setup() {
try {
bg = ImageIO.read(Menu.class.getResourceAsStream("/backgrounds/Instructionsbg.gif"));
}
catch (Exception e) {
e.printStackTrace();
}
t = new Timer(5,this);
t.start();
}
public void actionPerformed(ActionEvent e) {
repaint();
}
public void paintComponent(Graphics g) {
g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);
g2.fillRect(0,0,640,480);
g2.drawImage(bg,0,0,null);
Font f = new Font("FreeSerif", Font.ROMAN_BASELINE, 20);
g2.setFont(f);
g2.setColor(Color.RED);
g2.drawString("SPACE BAR to go back to menu.", 600, 400);
}
}
因此,使用CardLayout没有任何用处。
这与定制绘画无关。您应该能够使用CardLayout
(或者实际上是您想要的任何布局管理器)。
您永远不会调用super.paintcomponent
,它负责准备用于绘制的图形
上下文....
// Should be protected...
// Should have @Override annotation
public void paintComponent(Graphics g) {
// super.paintComponent(g) goes here...
//...
}
您还可能发现,KeyListener
超时停止响应,甚至是随机的。KeyListener
有一些焦点问题,这使得它可以管理多个组件,您会发现密钥绑定API更适合您的需要
问题内容: 我想通过单击JPanels上的按钮在JPanels之间切换。 例如:我有一个带有JButton simknop的JPanel sim和一个带有JButton helpknop的JPanel帮助,我想通过单击按钮在这两个JPanel之间进行切换。当我单击JButton simknop时,应显示JPanel帮助;当我单击JButton帮助时,应显示JPanel sim。 您可以在下面找到不
我偶然发现了这种并发症,花了4个多小时调试和谷歌搜索,但无济于事... 基本上我这里有1个JFrame,2个JPanel。我将JFrame设置为JPanel的第1个内容窗格,当我运行应用程序时,JFrame将显示,其中包含JPanel。 现在这个JPanel里面有1个JButton,当我点击它时,我希望它切换到另一个JPanel。正如您从代码中看到的,当我单击JButton(AddProduct)
所以我正在尝试制作一个basic程序来学习更多关于Java的知识,而我在切换屏幕时遇到了麻烦。我想有一个display类,我可以在其他类中调用它来处理所有的面板等等,然后创建一个类来构建每个面板。我现在尝试做的是使用startmenu类中的一个按钮使用display类中的一个方法从一个面板切换到另一个面板。 以下是类中的代码: 下面是我的display类:
下面的代码生成九个单独的JPanels,其中有9个按钮。九个JPanel使用GridLayout排列到一个基本JPanel上。然后使用边框布局将这个基本JPanel放置到ContentPane上。我对JButtons和每个JPanel使用边框来明确定义它们的分离。每个JPanel中的JButtons看起来都很好,但是JPanels之间有一个间隙,这导致了双行的出现,这让我非常恼火。我尝试将每个JP
有什么建议如何在VS Code中的代码和集成终端之间切换? 例如,在 PowerShell ISE 中,它是:Ctr D 终端和 Ctr I 代码 找不到任何类似的VS Code。 提前感谢您的任何建议
例如,如何在资源管理器和编辑器之间切换,或在编辑器和终端之间切换?