Я думаю, вы слишком все усложняете.
Стеклянная панель будет самым верхним компонентом (когда она видна), рисуя поверх всего остального. Если вы просто хотите "наложить" один компонент на другой, есть гораздо более простые решения...
Самая простая идея, которую я могу придумать, это использовать JLayeredPane
, настроив его на использование GridBagLayout
, чтобы вам не нужно было беспокоиться о позиционировании дочерних компонентов. Это даст вам быстрые и простые методы изменения порядка компонентов.
Другим решением было бы просто добавить компонент наложения непосредственно поверх компонента подложки.
![введите здесь описание изображения](https://i.stack.imgur.com/JUSQj.png)
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Overlay {
public static void main(String[] args) {
new Overlay();
}
public Overlay() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
ImagePane imagePane = new ImagePane();
imagePane.setLayout(new BorderLayout());
imagePane.add(new OverlayPane());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(imagePane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class OverlayPane extends JPanel {
public OverlayPane() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.setStroke(new BasicStroke(4));
int radius = 40;
g2d.drawOval(326 - radius / 2, 351 - radius / 2, radius, radius);
g2d.drawOval(416 - radius / 2, 351 - radius / 2, radius, radius);
int size = 20;
g2d.drawLine(374, 400, 374 - size, 400 + size);
g2d.drawLine(374, 400, 374 + size, 400 + size);
g2d.dispose();
}
}
public class ImagePane extends JPanel {
private BufferedImage buffer;
public ImagePane() {
try {
buffer = ImageIO.read(new File("/path/to/your/image"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return buffer == null ? new Dimension(200, 200) : new Dimension(buffer.getWidth(), buffer.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(buffer, 0, 0, this);
g2d.dispose();
}
}
}
person
MadProgrammer
schedule
23.05.2013
Component
. ПокаJGraph
простирается отComponent
(прямо или косвенно), вы должны иметь возможность установить его в качестве стеклянной панели корневых панелей. Стеклянная панель будет закрашена поверх содержимого корневой панели, а это означает, что если вы уже не рисуете непосредственно поверх компонентаJGraph
(т. е. переопределяете методpaintComponent
или добавляете компоненты непосредственно к нему), то больше ничего не закрашиваете. - person MadProgrammer   schedule 23.05.2013JRootPane#setGlassPane
, чтобы установить свой собственный (помните, что если компонент не прозрачен, он закроет все остальное). Если вы используете стеклянную панель таким образом, она будет отображаться поверх всего остального, если только вы не рисуете непосредственно на ней или не добавляете к ней компоненты. Вместо этого вы можете использоватьJLayerdPane
. - person MadProgrammer   schedule 23.05.2013