gpt4 book ai didi

java - 使用 Java.swing 编写具有可调整大小组件的 GUI

转载 作者:行者123 更新时间:2023-11-30 09:48:25 24 4
gpt4 key购买 nike

我应该编写一个 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 以调整其组件的大小......

最佳答案

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

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

关于java - 使用 Java.swing 编写具有可调整大小组件的 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com