使用Java.swing使用可resize的组件对GUI进行编程

我应该编程GUI。 此GUI中的每个组件都必须能够动态resize。

到目前为止,我使用了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(), px, py); 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(), px, py); 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来调整其上的组件大小……

您必须从坐标确定组件点。 使用此代替p2来创建事件:

 Point p2 = SwingUtilities.convertPoint(this.getGlassPane(), p, component); 

您可以使用Component Resizer 。 它需要提前添加到所有组件中。

或者,您可以在选择组件时添加侦听器,然后在取消选择组件时删除侦听器。

在猜测您的实际程序正在做什么时,您发布的代码几乎没有帮助。 当您的代码出现问题时,您需要发布SSCCE 。