0

我是 Java 编程的初学者,所以我不知道我是否在这里使用了正确的术语。基本上,我有一个任务是编写一个小程序,它将背景颜色更改为按下 4 个颜色按钮中的任何一个。我得到了一个带有 ActionListener 的示例代码,并被告知使用 MouseListener 来实现它。

我能够成功地对其进行编程以使其工作,然后需求发生了变化。以下是我当前有效的代码(在要求更改之前)。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ButtonPanel extends JPanel implements MouseListener{
    private JButton abutton, bbutton, cbutton, dbutton;

    public ButtonPanel(){
        abutton = new JButton("Cyan");
        bbutton = new JButton("Orange");
        cbutton = new JButton("Magenta");
        dbutton = new JButton("Yellow");

        add(abutton);
        add(bbutton);
        add(cbutton);
        add(dbutton);

    /* register the specific event handler into each button */
        abutton.addMouseListener(this);
        bbutton.addMouseListener(this);
        cbutton.addMouseListener(this);
        dbutton.addMouseListener(this);
    }

/* implementation for the Mouse Event  */

    public void mouseClicked(MouseEvent evt){
        Object source = evt.getSource();
        if (source == abutton) setBackground(Color.cyan);
        else if (source == bbutton) setBackground(Color.orange);
        else if (source == cbutton) setBackground(Color.magenta);
        else if (source == dbutton) setBackground(Color.yellow);
        repaint();
    }

    public void mousePressed(MouseEvent evt){

    }

    public void mouseEntered(MouseEvent evt){

    }

    public void mouseReleased(MouseEvent evt){

    }

    public void mouseExited(MouseEvent evt){

    }
}

class ButtonFrame extends JFrame{
    public ButtonFrame(){
        setTitle("Low-level Mouse Event to Set Color");
        setSize(50, 50);
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){ System.exit(0);}
        });
        Container contentPane = getContentPane();
        contentPane.add(new ButtonPanel());
    }
}

public class ME_SetColor {
    public static void main(String[] args) {
        JFrame frame = new ButtonFrame();
        frame.pack();
        frame.setSize(400, 250);
        frame.setVisible(true);
    }
}

新要求是extends JPanel排除class ButtonPanel. 所以修改后的类必须是 class ButtonPanel implements MouseListener{ private JButton abutton, bbutton, cbutton, dbutton;

如果没有 JPanel,ButtonPanel 类将不是一个组件,因此它不能添加到contentPane. 有没有另一种方法可以使这个 ButtonPanel 成为一个组件,以便可以将其添加到 ButtonPanel 中contentPane?或者有没有其他方法可以实现这个程序?

4

1 回答 1

2

如果没有 JPanel,ButtonPanel 类将不是组件

您可以扩展 JComponent。JComponent 是 Swing 组件的基类。JPanel 本身是 JComponent 的一个简单扩展(有一个小的区别:JPanel 的opaque属性默认为 true,而 JComponent 默认为 false)。

但是,如果您的要求是排除ButtonPanel 的任何扩展,那么您是对的,您实际上不能使其成为可以添加到容器中的组件。

但是,您可以包含一个组件作为 ButtonPanel 的一个字段:

class ButtonPanel implements ... {
    private JPanel panel;
    private JButton abutton, bbutton, cbutton, dbutton;

    ...

    public JPanel getPanel() { return panel; }
}

然后在 ButtonFrame 中:

add(new ButtonPanel().getPanel());

顺便说一句,您不需要调用getContentPane()contentPane.add因为框架自己的add方法会自动执行此操作

于 2013-10-26T17:57:29.300 回答