Java 执行的操作不';我无法从jbutton那里得到信号

Java 执行的操作不';我无法从jbutton那里得到信号,java,swing,jpanel,action,jbutton,Java,Swing,Jpanel,Action,Jbutton,我试图编写一个代码来移动一个椭圆,所以我将椭圆设置在一个透明的JPanel中(它将是一个红色背景上的红色JPanel),并使用actionperformed来移动JPanel。在我将使JButton工作之后,我打算添加键夹。为什么actionperformed方法不能从JBUtton获取信号 public class PanelExample_Extended{ public static final int OVAL_WIDTH = 20, OVAL_HEIGHT = 20; public

我试图编写一个代码来移动一个椭圆,所以我将椭圆设置在一个透明的JPanel中(它将是一个红色背景上的红色JPanel),并使用actionperformed来移动JPanel。在我将使JButton工作之后,我打算添加键夹。为什么actionperformed方法不能从JBUtton获取信号

public class PanelExample_Extended{

public static final int OVAL_WIDTH = 20, OVAL_HEIGHT = 20;
public static int x1 = 50, y1 = 100;
JButton upButton;
JPanel transparentPanel;

public class MyGraphics extends JComponent {



    private static final long serialVersionUID = 7526472295622776147L;

    MyGraphics() {
        setPreferredSize(new Dimension(20,20));
    }

    public void paintComponent(Graphics g){
        super.paintComponents(g);
        g.setColor(Color.blue);
        g.fillOval(0, 0, OVAL_WIDTH, OVAL_HEIGHT);
    }

}

 public JPanel createContentPane (){

    JPanel totalGUI = new JPanel();
    totalGUI.setLayout(null);

    transparentPanel = new JPanel(new BorderLayout());
    transparentPanel.setBackground(Color.red);
    transparentPanel.setLocation(x1, y1);
    transparentPanel.setSize(20,20);
    MyGraphics tr = new MyGraphics();
    tr.setLocation(0, 0);
    transparentPanel.add(tr);
    totalGUI.add(transparentPanel);

    upButton = new JButton("up");
    upButton.setLocation(0,50);
    upButton.setSize(50,50);
    totalGUI.add(upButton);


    totalGUI.setOpaque(true);
    return totalGUI;
}

private static void createAndShowGUI() {

    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("[=] ??? [=]");


    PanelExample_Extended demo = new PanelExample_Extended();
    frame.setContentPane(demo.createContentPane());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(290, 100);
    frame.setVisible(true);
}

public void ActionPerformed(ActionEvent h){
    if( h.getSource() == upButton) {
        y1 = y1  - 10;
        transparentPanel.setLocation(x1, y1);
    }

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}

任何地方都没有对
addActionListener(…)
的调用。除非你先和一个听者“连接起来”,否则任何按钮都不会起作用,这是你作为编码者的责任

解决方案:在JButton上调用
addActionListener(…)
,并传入相应的侦听器。这在(现在添加的链接)中都有很好的描述,如果你对学习Swing很认真,我建议你不仅要看它,还要研究它


编辑:

  • 你的代码也没有ActionListener!你真的应该在我提供的链接上阅读教程
  • 正如@Radiodef所指出的,您已经将actionPerformed大写为错误。确保在所有重写的方法前面加上
    @Override
    注释,让编译器检查您的操作是否正确,方法“签名”是否正确
  • 此外,正如camickr指出的,x1和y1不应该是静态的。您应该为保存它们的类指定公共setter方法,
    setX1(intx1)
    setY1(inty1)
    ,并让需要设置这些字段的类调用这些方法
  • 此外,在移动组件时,请确保在容纳组件的容器上调用
    revalidate()
    repaint()
    ,以便重新定位和绘制组件

你能精简你的代码,使它只包含一个
JButton
实现吗?这段代码是从一个更大的代码精简而来的,我试图使它只包含与问题相关的最小组件……但我明白你的意思。我会编辑它。@עמוסרום,你有没有花时间看评论?在你上一篇文章()中,我声明你不应该使用静态变量。当你不听建议时,为什么还要发问???我们为您提供避免当前和未来问题的建议。@camickr:啊,x1和y1,我现在看到了。是的,它们不应该是静态的。事实上,我确实研究过它,从中我发现它更容易阅读。我错过了这一部分,但即使我实现了ActionListener并添加了upButton.addActionListener行(this);它不会移动…
ActionPerformed
也需要更改为
ActionPerformed
。伙计们,我真的在听你们所有的评论和答案,我正在努力学习每一件事,在发布之前搜索每一个问题(这样,我解决了99.99%的问题)。这是我的第一个swing代码,我很难理解它。非常感谢你们的帮助!