给出一个具有以下结构的扩展JFrame的类:
ContentPane of Class extending JFrame
|-JPanel
|-JButton
|-Jpanel
|-JButton
|-JTextField
该类的ContentPane具有两个JPanel,而该类具有powerLevel整数字段。
第一个JPanel具有一个JButton,该JButton应该调用实现ActionListener的类。此类的actionPerformed()方法应将powerLevel加1。
第二个JPanel有一个按钮,当按下该按钮时,应调用一个ActionListener,该监听器将在JTextField中显示powerLevel的值,该JTextField是同一JPanel的第二个组件。
我对GUI Java编程非常陌生,我不确定这是否可行。我认为在更改结构之前,我将获得更丰富的意见。我之所以使用这种结构,是因为它更容易控制布局的外观。
提前感谢。
有许多方法可以实现所需的功能。一种简单的解决方案是使用嵌套类。嵌套类可以访问持有类的类成员。在一个文件mre中演示了该解决方案(可以将整个代码复制粘贴到SwingMain.java
中并运行):
import java.awt.BorderLayout;
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.JTextField;
public class SwingMain {
private int powerLevel = 0;
SwingMain() {
creategui();
}
void creategui(){
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(new APanel(), BorderLayout.PAGE_START);
f.add(new BPanel(), BorderLayout.PAGE_END);
f.pack();
f.setVisible(true);
}
class APanel extends JPanel{
APanel() {
JButton increment = new JButton("Increment");
increment.addActionListener(new AActionLIstener());
add(increment);
}
class AActionLIstener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
powerLevel++;
}
}
}
class BPanel extends JPanel{
private final JTextField tf;
BPanel() {
JButton show = new JButton("Show");
show.addActionListener(new BActionLIstener());
add(show);
tf = new JTextField(String.valueOf(powerLevel),3);
add(tf);
}
class BActionLIstener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
tf.setText(String.valueOf(powerLevel));
}
}
}
public static void main(String[] args) {
new SwingMain();
}
}