面板之间的交换

时间:2016-10-05 08:23:01

标签: java swing graphics jpanel imageicon

我正在尝试在面板中的图像上添加按钮。我也试图在面板之间切换。该程序正在运行,但是当我点击"指令"按钮它在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();
    }

}

2 个答案:

答案 0 :(得分:0)

我不认为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;
}

答案 1 :(得分:0)

在第14行中,您声明了一个成员变量content,但您没有初始化它。如果您没有自己初始化成员变量,会员变量将自动初始化为null

private JPanel content;   // is automatically set to null

在第25行,您在setLayout上调用方法content

content.setLayout(new FlowLayout());

这会导致NullPointerException,因为contentnull

要详细了解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);
        }
    }); 
}