Программирование 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.