在面板之间切换
Swap between panels
我正在尝试在面板中的图像上添加按钮。我也在尝试在面板之间切换。该程序是 运行,但是当我单击 "instructions" 按钮时,它会在 cmd 中给出大量错误列表。有什么问题?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.JButton;
import javax.swing.JPanel;
public class htw10 extends JFrame
{
final JFrame f=new JFrame("Hunt The Wumpus");
private static final String FIRST_PANEL="first panel";
private static final String SECOND_PANEL="second panel";
private CardLayout cardLayout=new CardLayout();
private JPanel content;
public void start()
{
// Create a new panel, make 'content' refer to it
content = new JPanel();
// Set the content pane of the window to the panel we just created
f.setContentPane(content);
// Create a button group and some buttons
// Set the layout of the content panel and add buttons
content.setLayout(new FlowLayout());
// Create and add the intro panel and instruction panel to the content panel
content.add(introPanel(),FIRST_PANEL);
content.add(instructionPanel(),SECOND_PANEL);
f.setSize(750,500);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
}
private JPanel instructionPanel()
{
JPanel secondPanel=new JPanel();
ImageIcon icon=new ImageIcon("img2.jpg");
JLabel pic2 = new JLabel(icon);
secondPanel.add(pic2);
JButton b1=new JButton("Back");
content.add(b1);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,FIRST_PANEL);
}
});
secondPanel.repaint();
return secondPanel;
}
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
JLabel picLabel = new JLabel(icon);
iPanel.add(picLabel);
ButtonGroup group=new ButtonGroup();
JButton b1=new JButton("Instructions");
JButton b2=new JButton("Play");
JButton b3=new JButton("Exit");
picLabel.add(b1);
//f.getContentPane().add(picLabel,BorderLayout.SOUTH);
content.add(b1);
content.add(b2);
content.add(b3);
// Add a listener to the 'Instructions' button
// so that the cardLayout is shown when the button is clicked
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,SECOND_PANEL);
}
});
iPanel.repaint();
return iPanel;
}
public static void main(String args[])throws Exception
{
htw10 obj=new htw10();
obj.start();
}
}
我认为 Jpanel 没有您试图在下面的代码中调用的 drawImage 方法。
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
iPanel.drawImage(icon, 0, 0,getWidth(),getHeight(),this);
return iPanel;
}
您需要一个图形 (java.awt.Graphics
) 对象来调用 drawImage
方法。
此外,您可以尝试其他方法,例如
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
JLabel picLabel = new JLabel(icon);
iPanel.add(picLabel);
iPanel.repaint();
return iPanel;
}
在第 14 行中,您声明了一个成员变量 content
,但您并未对其进行初始化。成员变量如果不自己初始化,会自动初始化为null
:
private JPanel content; // is automatically set to null
在第 25 行中,您在 content
:
上调用方法 setLayout
content.setLayout(new FlowLayout());
这将导致 NullPointerException
因为 content
是 null
。
要详细了解 NullPointerException
是什么以及它发生的原因,请参阅:What is a NullPointerException, and how do I fix it?
您需要对 content
进行设置。看来这应该是指内容窗格。此外,您多次调用 introPanel()
方法,导致创建该面板的多个实例。那不是你想要的。该面板应该只创建一次,然后您应该使用那个面板。不要多次调用 introPanel()
。您的 start()
方法应如下所示:
public void start()
{
// Create a new panel, make 'content' refer to it
content = new JPanel();
// Set the content pane of the window to the panel we just created
f.setContentPane(content);
// Create a button group and some buttons
ButtonGroup group=new ButtonGroup();
JButton b1=new JButton("Instructions");
JButton b2=new JButton("Play");
JButton b3=new JButton("Exit");
// Set the layout of the content panel and add buttons
content.setLayout(new FlowLayout());
content.add(b1);
content.add(b2);
content.add(b3);
// Create and add the intro panel and instruction panel to the content panel
content.add(introPanel(),FIRST_PANEL);
content.add(instructionPanel(),SECOND_PANEL);
f.setSize(750,360);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
// Add a listener to the 'Instructions' button
// so that the cardLayout is shown when the button is clicked
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,SECOND_PANEL);
}
});
}
我正在尝试在面板中的图像上添加按钮。我也在尝试在面板之间切换。该程序是 运行,但是当我单击 "instructions" 按钮时,它会在 cmd 中给出大量错误列表。有什么问题?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.JButton;
import javax.swing.JPanel;
public class htw10 extends JFrame
{
final JFrame f=new JFrame("Hunt The Wumpus");
private static final String FIRST_PANEL="first panel";
private static final String SECOND_PANEL="second panel";
private CardLayout cardLayout=new CardLayout();
private JPanel content;
public void start()
{
// Create a new panel, make 'content' refer to it
content = new JPanel();
// Set the content pane of the window to the panel we just created
f.setContentPane(content);
// Create a button group and some buttons
// Set the layout of the content panel and add buttons
content.setLayout(new FlowLayout());
// Create and add the intro panel and instruction panel to the content panel
content.add(introPanel(),FIRST_PANEL);
content.add(instructionPanel(),SECOND_PANEL);
f.setSize(750,500);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
}
private JPanel instructionPanel()
{
JPanel secondPanel=new JPanel();
ImageIcon icon=new ImageIcon("img2.jpg");
JLabel pic2 = new JLabel(icon);
secondPanel.add(pic2);
JButton b1=new JButton("Back");
content.add(b1);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,FIRST_PANEL);
}
});
secondPanel.repaint();
return secondPanel;
}
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
JLabel picLabel = new JLabel(icon);
iPanel.add(picLabel);
ButtonGroup group=new ButtonGroup();
JButton b1=new JButton("Instructions");
JButton b2=new JButton("Play");
JButton b3=new JButton("Exit");
picLabel.add(b1);
//f.getContentPane().add(picLabel,BorderLayout.SOUTH);
content.add(b1);
content.add(b2);
content.add(b3);
// Add a listener to the 'Instructions' button
// so that the cardLayout is shown when the button is clicked
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,SECOND_PANEL);
}
});
iPanel.repaint();
return iPanel;
}
public static void main(String args[])throws Exception
{
htw10 obj=new htw10();
obj.start();
}
}
我认为 Jpanel 没有您试图在下面的代码中调用的 drawImage 方法。
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
iPanel.drawImage(icon, 0, 0,getWidth(),getHeight(),this);
return iPanel;
}
您需要一个图形 (java.awt.Graphics
) 对象来调用 drawImage
方法。
此外,您可以尝试其他方法,例如
public JPanel introPanel()
{
JPanel iPanel=new JPanel();
ImageIcon icon=new ImageIcon("img1.jpg");
JLabel picLabel = new JLabel(icon);
iPanel.add(picLabel);
iPanel.repaint();
return iPanel;
}
在第 14 行中,您声明了一个成员变量 content
,但您并未对其进行初始化。成员变量如果不自己初始化,会自动初始化为null
:
private JPanel content; // is automatically set to null
在第 25 行中,您在 content
:
setLayout
content.setLayout(new FlowLayout());
这将导致 NullPointerException
因为 content
是 null
。
要详细了解 NullPointerException
是什么以及它发生的原因,请参阅:What is a NullPointerException, and how do I fix it?
您需要对 content
进行设置。看来这应该是指内容窗格。此外,您多次调用 introPanel()
方法,导致创建该面板的多个实例。那不是你想要的。该面板应该只创建一次,然后您应该使用那个面板。不要多次调用 introPanel()
。您的 start()
方法应如下所示:
public void start()
{
// Create a new panel, make 'content' refer to it
content = new JPanel();
// Set the content pane of the window to the panel we just created
f.setContentPane(content);
// Create a button group and some buttons
ButtonGroup group=new ButtonGroup();
JButton b1=new JButton("Instructions");
JButton b2=new JButton("Play");
JButton b3=new JButton("Exit");
// Set the layout of the content panel and add buttons
content.setLayout(new FlowLayout());
content.add(b1);
content.add(b2);
content.add(b3);
// Create and add the intro panel and instruction panel to the content panel
content.add(introPanel(),FIRST_PANEL);
content.add(instructionPanel(),SECOND_PANEL);
f.setSize(750,360);
f.setDefaultCloseOperation(EXIT_ON_CLOSE);
f.setVisible(true);
// Add a listener to the 'Instructions' button
// so that the cardLayout is shown when the button is clicked
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
cardLayout.show(content,SECOND_PANEL);
}
});
}