使用Java.swing使用可调整大小的组件对GUI进行编程

时间:2011-06-08 14:45:44

标签: java swing

我应该编程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以调整其上的组件...

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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