如何使Java Glasspane在调整GUI大小的情况下仍保持在某个位置?

如何使Java Glasspane在调整GUI大小的情况下仍保持在某个位置?,java,swing,user-interface,glasspane,Java,Swing,User Interface,Glasspane,当我调整整个界面的大小时,Java玻璃窗格会自动调整大小,但我想让它固定到特定的位置,它将如下所示: 而不是在调整大小时四处移动 谢谢有很多方法可以实现这一点,但基本要求将需要对您的窗格玻璃内容试图坚持的组件进行某种引用。这意味着,当组件被更新并需要进行布局时,您可以找到粘性组件的位置,并更新内容在玻璃窗格上的位置 请记住,玻璃窗格是一个容器,它占据了窗口的全部内容,您需要更新玻璃窗格中包含的内容 import java.awt.AlphaComposite; import java.awt.B

当我调整整个界面的大小时,Java玻璃窗格会自动调整大小,但我想让它固定到特定的位置,它将如下所示:

而不是在调整大小时四处移动


谢谢

有很多方法可以实现这一点,但基本要求将需要对您的窗格玻璃内容试图坚持的组件进行某种引用。这意味着,当组件被更新并需要进行布局时,您可以找到粘性组件的位置,并更新内容在玻璃窗格上的位置

请记住,玻璃窗格是一个容器,它占据了窗口的全部内容,您需要更新玻璃窗格中包含的内容

import java.awt.AlphaComposite;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class StickyGlassPaneExample {

    public static void main(String[] args) {
        new StickyGlassPaneExample();
    }

    public StickyGlassPaneExample() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                StickyGlassPane stickyGlassPane = new StickyGlassPane();
                TestPane testPane = new TestPane(stickyGlassPane);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(testPane);
                frame.setSize(600, 500);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
                frame.setGlassPane(stickyGlassPane);
                stickyGlassPane.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<JTextField> fields;

        public TestPane(StickyGlassPane stickyGlassPane) {
            fields = new ArrayList<JTextField>(100);
            for (int index = 0; index < 100; index++) {
                JTextField field = new JTextField(10);
                fields.add(field);
                add(field);
            }
            int fieldIndex = (int)(Math.random() * (fields.size() - 1));
            JTextField sticky = fields.get(fieldIndex);
            sticky.setText("Sticky");
            stickyGlassPane.setStickyComponent(sticky);
        }
    }

    public class StickyGlassPane extends JPanel {

        private Component component;

        private JPanel overlay;

        public StickyGlassPane() {
            setOpaque(false);
            overlay = new JPanel() {

                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    Graphics2D g2d = (Graphics2D) g.create();
                    g2d.setColor(Color.RED);
                    g2d.drawRect(0, 0, getWidth(), getHeight());
                    g2d.setComposite(AlphaComposite.SrcOver.derive(0.5f));
                    g2d.fillRect(0, 0, getWidth(), getHeight());
                }

            };
            overlay.setOpaque(false);

            add(overlay);
        }

        @Override
        public void doLayout() {
            if (component != null) {
                Point p = component.getLocation();
                SwingUtilities.convertPoint(component, p, this);
                overlay.setLocation(p);
                overlay.setSize(component.getSize());
            } else {
                overlay.setBounds(0, 0, 0, 0);
            }
        }

        public void setStickyComponent(Component component) {
            this.component = component;
            revalidate();
        }

    }

}

这将归结为玻璃窗格的布局方式…不需要作废。revalidate的API描述是这样开始的:*调用失效,然后…@camickr旧习惯消失hard@mKorbel我认为基于此的问题,代码是我自己的:P