[英]How to make a class a component in Java Swing?
我是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);
}
}
新要求是为class ButtonPanel
排除extends JPanel
和任何其他扩展。 所以修改后的类必须是class ButtonPanel implements MouseListener{ private JButton abutton, bbutton, cbutton, dbutton;
如果没有JPanel,ButtonPanel类将不是组件,因此无法将其添加到contentPane
。 还有另一种方法可以将这个ButtonPanel组成一个组件,以便将它添加到contentPane
吗? 或者有没有其他方法来实现这个程序?
没有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
方法会自动执行此操作 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.