我正在编写一个使用JButton的程序。当用户单击按钮时,背景应更改颜色,但无法从actionPerformed()方法访问JFrame。有人可以告诉我如何让它发挥作用吗?
import java.awt.event.*;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
public class HandlerClass implements ActionListener{
public static void main(String[] args){
HandlerClass handler = new HandlerClass();
final JFrame f = new JFrame("Testing out these JPanels");
f.setSize(400, 100);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setLayout(new GridLayout(2, 3));
JButton b = new JButton("button 1");
b.addActionListener(new HandlerClass());
JButton butt = new JButton("button 2");
JButton bug = new JButton("button 3");
JButton button = new JButton("button 4");
JButton button5 = new JButton("button 5");
JButton button6 = new JButton("button 6");
JPanel p = new JPanel();
p.setVisible(true);
JPanel pnl = new JPanel();
p.add(b);
p.add(butt);
p.add(bug);
pnl.add(button);
pnl.add(button5);
pnl.add(button6);
f.add(p, BorderLayout.CENTER);
f.add(pnl, BorderLayout.SOUTH);
f.setVisible(true);
f.setBackground(Color.RED);
}
public void actionPerformed(ActionEvent e){
f.setBackground(Color.WHITE);
}
}
答案 0 :(得分:4)
答案 1 :(得分:2)
你几乎没有选择:
将JFrame
实例移到主体外部,使其成为实例变量:
public class HandlerClass {
private JFrame frame;
public HandlerClass() {
...
}
}
将ActionListener
移到同一方法中:
public class HandlerClass {
public HandlerClass() {
final JFrame frame = new JFrame();
JButton button = new JButton();
...
button.addActionListener(new ActionerListener() {
@Override
public void actionPerformed(ActionEvent e){
frame.setBackground(Color.WHITE);
}
}
}
}
第二种选择的唯一问题是,您必须使用frame
修饰符final
来{{1}}进行引用。
执行上述两项操作。
答案 2 :(得分:0)
你的问题:
JFrame can't be accessed from the actionPerformed()
解决方案是,您无法从其他方法访问本地变量 看看here 和here
现在重要的是:
您的JPanel
上有两个JFrame
。因此,如果您更改JFrame
的颜色,那么您将无法使用。{1}}
看到颜色变化。所以我的建议是改变JPanel
的颜色。
以下面的代码为例:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class HandlerClass extends JFrame {
private JPanel contentPane;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
HandlerClass frame = new HandlerClass();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public HandlerClass() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
GridBagLayout gbl_contentPane = new GridBagLayout();
gbl_contentPane.columnWidths = new int[]{0, 0, 0, 0, 0, 0, 0};
gbl_contentPane.rowHeights = new int[]{0, 0, 0, 0};
gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE};
gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE};
contentPane.setLayout(gbl_contentPane);
JButton btnRed = new JButton("Red");
GridBagConstraints gbc_btnRed = new GridBagConstraints();
gbc_btnRed.insets = new Insets(0, 0, 5, 5);
gbc_btnRed.gridx = 3;
gbc_btnRed.gridy = 1;
contentPane.add(btnRed, gbc_btnRed);
JButton btnBlue = new JButton("Blue");
GridBagConstraints gbc_btnBlue = new GridBagConstraints();
gbc_btnBlue.insets = new Insets(0, 0, 5, 0);
gbc_btnBlue.gridx = 5;
gbc_btnBlue.gridy = 1;
contentPane.add(btnBlue, gbc_btnBlue);
JButton btnWhite = new JButton("White");
GridBagConstraints gbc_btnWhite = new GridBagConstraints();
gbc_btnWhite.insets = new Insets(0, 0, 0, 5);
gbc_btnWhite.gridx = 3;
gbc_btnWhite.gridy = 2;
contentPane.add(btnWhite, gbc_btnWhite);
JButton btnGreen = new JButton("Green");
GridBagConstraints gbc_btnGreen = new GridBagConstraints();
gbc_btnGreen.gridx = 5;
gbc_btnGreen.gridy = 2;
contentPane.add(btnGreen, gbc_btnGreen);
btnRed.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
contentPane.setBackground(Color.red);
}
});
btnBlue.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
contentPane.setBackground(Color.blue);
}
});
btnWhite.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
contentPane.setBackground(Color.WHITE);
}
});
btnGreen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
contentPane.setBackground(Color.green);
}
});
pack();
}
}
截屏: