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



我应该为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来调整其上组件的大小…

您必须根据坐标确定组件点。使用this而不是p2来创建事件:

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

您可能可以使用组件调整器。它需要提前添加到所有组件中。

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

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

最新更新