You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

优化建议

  1. Random对象无需重复创建,单个实例即可生成多次随机数
  2. 若要避免按钮被窗口标题栏、边框遮挡,可使用内容面板的宽高计算边界,效果更准确:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:06:01