JInternalFrame перекрывает верхний уровень JLayeredPane - PullRequest
0 голосов
/ 12 июля 2020

Я хочу добавить всегда видимую панель - например, android плавающую кнопку - в нижний угол JFrame. Фрейм имеет строку состояния, строку меню и jdesktoppane в качестве центрального содержимого. Всегда видимая нижняя угловая панель имеет форму ar c и должна находиться над панелью состояния.

Внутренние рамки не должны go перед всегда видимой нижней угловой панелью.

Проблема: при перетаскивании внутренней рамки некоторые картины угловой панели загрязняют внутреннюю рамку. см. рисунок 3.

Я пробовал Glasspane, JLayeredPane, но мне это не удалось.

Ниже приведен минимальный рабочий пример, использующий подход Overlay Panel.

enter image description here

Desired

Нежелательный

package deneme;

import javax.swing.*;
import java.awt.*;

public class OverlaySample {

    public static void main(String args[]) {
        JFrame frame = new JFrame("Overlay Sample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel();
        panel.setLayout(new OverlayLayout(panel));


        JPanel contentPane = createContentPanel();
        JPanel overlay = createBottomCornerPanel();


        panel.add(overlay);
        panel.add(contentPane);


        frame.add(panel, BorderLayout.CENTER);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private static JPanel createContentPanel() {
        JPanel contentPane = new JPanel(new BorderLayout());

        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("TOP"));
        contentPane.add(topPanel, BorderLayout.NORTH);

        JDesktopPane desktopPane = new JDesktopPane();
        JInternalFrame internalFrame = new JInternalFrame("deneme", true, false, true, true);
        internalFrame.add(new JButton("Deneme Frame"));
        internalFrame.add(new JButton("Deneme Frame 2"));
        internalFrame.add(new JCheckBox("Deneme Frame 3"));

        internalFrame.setBounds(100, 100, 400, 300);
        internalFrame.setVisible(true);
        desktopPane.add(internalFrame);
        contentPane.add(desktopPane, BorderLayout.CENTER);

        JPanel statusPanel = new JPanel();
        statusPanel.add(new JLabel("Status"));
        contentPane.add(statusPanel, BorderLayout.SOUTH);
        return contentPane;
    }

    private static JPanel createBottomCornerPanel() {
        JPanel compass = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {

                Graphics2D g2d = (Graphics2D) g;
                Color oldColor = g2d.getColor();
                g2d.setColor(Color.RED);
                g2d.drawRect(0, 0, 20, 20);
                g2d.fillArc(0, 0, getWidth() * 2, getHeight() * 2, 90, 90);
                g2d.setColor(oldColor);
                super.paintComponent(g);
            }

            @Override
            public boolean contains(int x, int y) {
                int w = getWidth();
                int h = getHeight();
                return (w - x) * (w - x) + (h - y) * (h - y) < w * w;
            }
        };

        JPanel overlay = new JPanel(new GridBagLayout());

        compass.setOpaque(false);
        //compass.setBackground(Color.RED);
        compass.setPreferredSize(new Dimension(300, 300));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));
        compass.add(new JButton("Deneme"));
        compass.add(new JCheckBox("Dene"));


        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.fill = GridBagConstraints.BOTH;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        overlay.add(Box.createGlue(), gbc);


        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.fill = GridBagConstraints.NONE;
        gbc.weightx = 0.0;
        gbc.weighty = 0.0;
        overlay.add(compass, gbc);

        // overlay.setBackground(Color.YELLOW);
        overlay.setOpaque(false);
        return overlay;
    }

}
...