【发布时间】:2016-02-15 15:37:31
【问题描述】:
我在 JFrame 中显示组件时遇到了一个奇怪的问题。
我必须在不使用 Swing 的情况下编写自己的 GUI 引擎(按钮、文本框等)。只允许使用 JFrame/JPanel。
假设我想放置 3 个按钮。
我的按钮类:
public class Button extends JPanel implements MouseListener {
Rectangle r = new Rectangle();
String text;
int X,Y,W,H;
public Button(int x, int y, int w, int h, String t)
{
X=x;
Y=y;
W=w;
H=h;
this.setBackground(Color.CYAN);
addMouseListener(this);
r.setSize(w, h);
r.setLocation(x, y);
this.text = t;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.draw(r);
g2d.drawString(text, X+W/2, Y+H/2);
}
@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
if((arg0.getButton()==1) && r.contains(arg0.getPoint()))
System.out.println(arg0.getPoint().toString());
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
}
在主类中,我创建了一个 JFrame 和 JPanel。我添加到 JPanel 3 按钮,最后将 JPanel 添加到 JFrame,但只显示最后一个声明的按钮。
public static void main(String[] args) {
// TODO Auto-generated method stub
JFrame f = new JFrame("Demo");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setBackground(Color.cyan);
JPanel j = new JPanel(new BorderLayout());
j.add(new Button(10,10,100,50,"text"));
j.add(new Button(10,100,100,50,"text2"));
j.add(new Button(300,10,100,50,"text3"));
f.add(j);
f.pack();
f.setSize(640, 400);;
f.setVisible(true);
}
我做错了什么?
【问题讨论】:
-
不确定您要做什么。使用组件或绘画。如果您使用组件,那么您可以使用所有内置的 Swing 功能,例如 MouseListeners。如果您只是绘制图片,那么您还需要实现所有这些功能。那么作业的目的是什么?
-