Java中如何在静态上下文中调用JFrame的非静态方法
问题修复
错误原因
你遇到的编译错误是因为在非静态成员方法Button1_ActionPerformed中,直接用类名Fangmich调用了非静态方法getWidth()、getHeight()。非静态方法属于类的实例对象,不能通过类名直接访问。
修复方案
由于Button1_ActionPerformed本身就是Fangmich类的非静态成员方法,直接调用当前实例的对应方法即可,无需用类名引用,修改对应代码行:
// 修改前(错误) int maxX = Fangmich.getWidth() - Button1.getWidth(); int maxY = Fangmich.getHeight() - Button1.getHeight(); // 修改后(正确) int maxX = getWidth() - Button1.getWidth(); int maxY = getHeight() - Button1.getHeight();
优化建议
Random对象无需重复创建,单个实例即可生成多次随机数- 若要避免按钮被窗口标题栏、边框遮挡,可使用内容面板的宽高计算边界,效果更准确:
int maxX = getContentPane().getWidth() - Button1.getWidth(); int maxY = getContentPane().getHeight() - Button1.getHeight();
修改后完整可运行代码
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class Fangmich extends JFrame { private JButton Button1 = new JButton(); private Random random = new Random(); public Fangmich() { super(); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); int frameWidth = 300; int frameHeight = 300; setSize(frameWidth, frameHeight); Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); int x = (d.width - getSize().width) / 2; int y = (d.height - getSize().height) / 2; setLocation(x, y); setTitle("Fangmich"); setResizable(true); Container cp = getContentPane(); cp.setLayout(null); Button1.setBounds(0, 0, 73, 41); Button1.setText("Fang mich!"); Button1.setMargin(new Insets(2, 2, 2, 2)); Button1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Button1_ActionPerformed(evt); } }); cp.add(Button1); setVisible(true); } public static void main(String[] args) { new Fangmich(); } public void Button1_ActionPerformed(ActionEvent evt) { int maxX = getContentPane().getWidth() - Button1.getWidth(); int maxY = getContentPane().getHeight() - Button1.getHeight(); int xLocation = random.nextInt(maxX); int yLocation = random.nextInt(maxY); Button1.setLocation(xLocation, yLocation); } }
内容的提问来源于stack exchange,提问作者SlothOath
相关产品推荐
相关产品推荐

