Программирование GUI с изменяемыми размерами компонентов с использованием Java.swing

Я должен программировать графический интерфейс. Каждый компонент в этом графическом интерфейсе должен иметь возможность динамического изменения размера.

До сих пор я работал со 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 ответа

Решение

Вы должны определить компонентную точку по вашей координате. Используйте это вместо p2 для создания события:

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

Возможно, вы сможете использовать компонент Resizer. Это должно быть добавлено ко всем компонентам заранее.

Или, может быть, вы можете добавить прослушиватель при выборе компонента, а затем удалить прослушиватель при отмене выбора компонента.

Код, который вы разместили, мало помогает при угадывании, что делает ваша настоящая программа. Если у вас есть проблемы с вашим кодом, вы должны опубликовать SSCCE.

Другие вопросы по тегам