我应该编程GUI。此GUI中的每个组件都必须能够动态调整大小。
到目前为止,我使用了GlassPane和ContentPane,添加了一个JPanel并在其上添加了一个按钮。单击GlassPane获取事件时,分析底层组件,为此特殊组件创建新句柄并将其处理到所述组件。 我添加了一个按钮,可以自动更改其大小。像我希望它工作的工作。 但是:当我改变框架的大小并立即点击按钮时,没有任何反应。 GlassPane能够识别按钮,但似乎有些错误......
以下是截取GlassPane并将事件提供给组件的代码:
private void resendEvent(MouseEvent e) {
//Point p = SwingUtilities.convertPoint(content.getGlassPane(), e.getPoint(), content.getContentPane());
Point p = e.getPoint();
Component component = SwingUtilities.getDeepestComponentAt(content.getContentPane(), p.x, p.y);
System.out.println(component.toString());
Point p2 = component.getLocation();
MouseEvent event = new MouseEvent(component, e.getID(), e.getWhen(), e.getModifiers(), p2.x, p2.y, e.getClickCount(), e.isPopupTrigger());
//following lines have the same effects
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
//component.dispatchEvent(event);
}
感谢您的帮助/建议
好的,这里还有一些代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import resize.ResizablePanel;
public class ExampleProblem extends JFrame {
public ExampleProblem () {
JPanel glassPane = new JPanel();
glassPane.setOpaque(false);
glassPane.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e) {
resendEvent(e);
}
@Override
public void mouseReleased(MouseEvent e) {
resendEvent(e);
}
});
this.setGlassPane(glassPane);
glassPane.setVisible(true);
JButton b = new JButton("Test");
b.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
System.out.println("Button clicked");
}});
JPanel p = new JPanel();
p.add(b);
setContentPane(p);
pack();
setVisible(true);
}
private void resendEvent(MouseEvent e) {//Point p = SwingUtilities.convertPoint(content.getGlassPane(), e.getPoint(), content.getContentPane());
Point p = e.getPoint();
Component component = SwingUtilities.getDeepestComponentAt(this.getContentPane(), p.x, p.y);
System.out.println(component.toString());
Point p2 = component.getLocation();
MouseEvent event = new MouseEvent(component, e.getID(), e.getWhen(), e.getModifiers(), p2.x, p2.y, e.getClickCount(), e.isPopupTrigger());
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
}
public static void main(String[] args) {
new ExampleProblem();
}
}
希望,问题现在有点清楚了。 有可能,我不应该使用setContentPane()吗?但我们不得不覆盖JContentPane以调整其上的组件...
答案 0 :(得分:1)
您可以使用Component Resizer。它需要提前添加到所有组件中。
或者您可以在选择组件时添加侦听器,然后在取消选择组件时删除侦听器。
在猜测您的实际程序正在做什么时,您发布的代码几乎没有帮助。当您的代码出现问题时,您需要发布SSCCE。
答案 1 :(得分:1)
您必须从坐标确定组件点。使用此代替p2来创建事件:
Point p2 = SwingUtilities.convertPoint(this.getGlassPane(), p, component);