Я хочу добавить всегда видимую панель - например, android плавающую кнопку - в нижний угол JFrame. Фрейм имеет строку состояния, строку меню и jdesktoppane в качестве центрального содержимого. Всегда видимая нижняя угловая панель имеет форму ar c и должна находиться над панелью состояния.
Внутренние рамки не должны go перед всегда видимой нижней угловой панелью.
Проблема: при перетаскивании внутренней рамки некоторые картины угловой панели загрязняют внутреннюю рамку. см. рисунок 3.
Я пробовал Glasspane, JLayeredPane, но мне это не удалось.
Ниже приведен минимальный рабочий пример, использующий подход Overlay Panel.
Нежелательный
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;
}
}