我无法将Panel类放到主类中。我似乎无法实例化并将按钮注册到actionPerformed方法。这个项目假设使用带有9个输入按钮的网格布局(其他3个按钮用于输入,空格和清除)然后在JTextArea上显示输入。我相信我已经正确设置了Panel类,但是在将JButton数组放在一起时会出现问题,然后将其注册到actionPerformed方法。任何指针都将非常感激。 (附带问题,如何将代码复制并粘贴到代码块中?)
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class TextButtons extends JFrame implements ActionListener {
private JButton[] buttons;
private JTextArea textArea;
private final int ENTER; //Index of Enter button in buttons
private final int SPACE; //Index of Space button in buttons
private final int CLEAR; //Index of Clear button in buttons
public TextButtons(String title) {
super(title);
JFrame frame = new JFrame("Text Button");
//TODO: instantiate all JButtons, add them to the buttons array,
// and register "this" as the ActionListener for each button.
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton();
//this.buttons.addActionListener(e);
}
ENTER = 9;
SPACE = 10;
CLEAR = 11;
buttons[ENTER] = new JButton("\n");
buttons[SPACE] = new JButton(" ");
buttons[CLEAR] = new JButton("clear");
JTextArea textArea = new JTextArea();
textArea.setEditable(false);
TextButtonsPanel mainPanel = new TextButtonsPanel(buttons, textArea);
this.getContentPane().add(mainPanel);
this.pack();
this.setVisible(true);
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
@Override
public void actionPerformed(ActionEvent e) {
// ??
}
public static void main(String[] args) {
final TextButtons f = new TextButtons("Text Buttons");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
PanelClass
public class TextButtonsPanel extends JPanel {
public TextButtonsPanel(JButton[] buttons, JTextArea textArea) {
int ENTER = 11;
JPanel mainPanel = new JPanel(new GridLayout(4, 3));
JButton b1 = new JButton("A");
JButton b2 = new JButton("B");
JButton b3 = new JButton("C");
JButton b4 = new JButton("1");
JButton b5 = new JButton("2");
JButton b6 = new JButton("3");
JButton b7 = new JButton("X");
JButton b8 = new JButton("Y");
JButton b9 = new JButton("Z");
add(b1);
mainPanel.add(b2);
mainPanel.add(b3);
mainPanel.add(b4);
mainPanel.add(b5);
mainPanel.add(b6);
mainPanel.add(b7);
mainPanel.add(b8);
mainPanel.add(b9);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setPreferredSize(new Dimension(80, 120));
mainPanel.add(scrollPane);
}
}
}
答案 0 :(得分:2)
您的TextButtonsPanel
延伸JPanel
,但是您要将JPanel
的所有内容添加到名为mainPanel
的{{1}},这些内容永远不会添加到任何内容中。
由于JButton
是本地变量,因此您永远无法将外部ActionListener
附加到其中。不确定这是好事还是坏事。
我会创建一个只包含按钮的TextButtonsPane
,没有其他组件。它只是生成事件。
我会提供一个addActionListener
和removeActionListener
,它只会根据其中包含的所有按钮注册监听器。
这样,按钮窗格并不关心它的用途,它只是生成其他可以使用的事件。
您可能需要一些时间来阅读Creating a GUI with Swing
答案 1 :(得分:2)
我似乎无法实例化并将按钮注册到actionPerformed方法。
您可以像这样组织代码:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class TextButtonPanel extends JPanel implements ActionListener {
public TextButtonPanel(String[] labels) {
setLayout(new GridLayout(0, 3)); //same as self.setLayout(..)
JButton button;
for (String label : labels) {
button = new JButton(label);
button.addActionListener(this);
add(button); //same as self.add(button)
}
}
public void actionPerformed(ActionEvent e) {
JButton button = (JButton) e.getSource();
System.out.println(button.getText());
}
}
class MyGui {
public MyGui() {
JFrame frame = new JFrame("Name");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setBounds(200, 100, 500, 300);
Container cpane = frame.getContentPane();
String[] labels = {"A", "B", "C", "D"};
TextButtonPanel panel = new TextButtonPanel(labels);
cpane.add(panel);
frame.setVisible(true);
}
}
public class SwingProg {
private static void createAndShowGUI() {
new MyGui();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}