无法在各种方法中显示面板和按钮

时间:2013-11-05 15:14:13

标签: java constructor jframe jpanel actionlistener

我正在使用计算器/手机输入键盘,并且在实际显示按钮时遇到各种麻烦。当所有东西都在main方法中时,我让它工作,但这不允许我实现ActionListener,我需要它才能使按钮工作。这是我现在的代码:

import java.awt.*; //Import everything
import java.util.*;
import java.awt.event.*;
import javax.swing.*; //Seriously, everything, just makes this easier

public class Keypad extends JPanel implements ActionListener {

public static void main(String[] args) {
    //Create the frame that holds everything else
    JFrame frame = new JFrame ("Almost Functional Keypad");
    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

    //Create the keypad
    frame.getContentPane().add(new Keypad());

    //Stuff to do so it won't break
    frame.setPreferredSize(new Dimension(350,400));
    frame.pack();
    frame.setVisible(true);
    frame.setResizable(false);
}

public Keypad(){
    //Create the array of JPanels and labels
    JButton[] keyList = new JButton[12];
    JLabel[] keyLabel = new JLabel[12];

    //Array with the key labels
    String[] keyLabelText = {"1","2","3","4","5","6","7","8","9","*","0","#"};

    //We need a counter
    int i;

    //Create the panels
    for (i=0; i<12; i++){
        keyList[i]= new JButton();
        keyList[i].setPreferredSize (new Dimension(100, 75));
        keyLabel[i] = new JLabel (keyLabelText[i]);
        keyList[i].add (keyLabel[i]);
        keyList[i].addActionListener(this);
    }

    //Text field that only the buttons can modify
    JTextArea displayText = new JTextArea();
    displayText.setPreferredSize(new Dimension(320, 20));

    //Create the "clear" button
    JButton clear = new JButton();
    clear.setPreferredSize(new Dimension(300, 40));
    JLabel clearLabel = new JLabel ("Clear");
    clear.add(clearLabel);
    clear.addActionListener(this);

    // Set up primary panel
    JPanel primary = new JPanel();
    primary.add(displayText);
    for (i=0; i<12; i++){
        primary.add (keyList[i]);
    }
    primary.add(clear);
}

public void actionPerformed (ActionEvent event){
        //Stuff goes here eventually
}


}

我很确定它与在main中调用Keypad()有关,但我不知道如何调用它并让事情显示出来。我必须在构造函数中创建面板,否则我无法添加ActionListener,但现在我不知道如何将它们放入框架中。

感谢您的帮助,我希望这只是一件小而愚蠢的事我忘了。

1 个答案:

答案 0 :(得分:0)

我对您的代码所做的更改是将构造函数更改为返回JPanel的方法以及一些非常小的更改。您应该注意到现在该函数返回一个JPanel来修复您的问题。

检查

import java.awt.*; //Import everything
import java.util.*;
import java.awt.event.*;
import javax.swing.*; //Seriously, everything, just makes this easier

public class Keypad extends JPanel implements ActionListener {

public static void main(String[] args) {
//Create the frame that holds everything else
JFrame frame = new JFrame ("Almost Functional Keypad");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

//Create the keypad
frame.getContentPane().add(getKeypad());

//Stuff to do so it won't break
frame.setPreferredSize(new Dimension(350,400));
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
}

public static JPanel getKeypad(){
//Create the array of JPanels and labels

Keypad obj = new Keypad();
JButton[] keyList = new JButton[12];
JLabel[] keyLabel = new JLabel[12];

//Array with the key labels
String[] keyLabelText = {"1","2","3","4","5","6","7","8","9","*","0","#"};

//We need a counter
int i;

//Create the panels
for (i=0; i<12; i++){
    keyList[i]= new JButton();
    keyList[i].setPreferredSize (new Dimension(100, 75));
    keyLabel[i] = new JLabel (keyLabelText[i]);
    keyList[i].add (keyLabel[i]);
    keyList[i].addActionListener(obj);
}

//Text field that only the buttons can modify
JTextArea displayText = new JTextArea();
displayText.setPreferredSize(new Dimension(320, 20));

//Create the "clear" button
JButton clear = new JButton();
clear.setPreferredSize(new Dimension(300, 40));
JLabel clearLabel = new JLabel ("Clear");
clear.add(clearLabel);
clear.addActionListener(obj);

// Set up primary panel
JPanel primary = new JPanel();
primary.add(displayText);
for (i=0; i<12; i++){
    primary.add (keyList[i]);
}
primary.add(clear);
return primary;
}

public void actionPerformed (ActionEvent event){
    //Stuff goes here eventually
    // use it like this
    //if(event.getSource()==whateveryouwanttotest){
    //
    //}
}
}
相关问题