有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将JGraph转换为玻璃窗格?

我有一个类:public class GraphEditorPane extends JGraph

我使用的“石墨二吗啉”如下所示:

public JScrollPane getGraphPaneScrollPane() {
    if (graphPaneScrollPane == null) {
        graphPaneScrollPane = new JScrollPane();
        //graphPaneScrollPane.setViewportView(getGraphEditorPane());
        graphPaneScrollPane.setViewportView(getGraphEditorPane());
    }
    return graphPaneScrollPane;
}
public GraphEditorPane getGraphEditorPane() {
graphEditorPane = new GraphEditorPane(); }

我用这个“石墨烯”在上面画了一张图。现在我的问题是——有没有办法把这个JGraph转换成一个玻璃窗格,这样我的“石墨烯”就会是透明的,我仍然可以在上面画画


共 (1) 个答案

  1. # 1 楼答案

    我觉得你把事情复杂化了

    玻璃窗格将是最上面的组件(当可见时),覆盖在所有其他组件的顶部。如果你只是想“覆盖”一个组件在另一个组件上,你有更简单的解决方案

    我能想到的最简单的想法是使用JLayeredPane,将其设置为使用GridBagLayout,这样就不需要担心子组件的定位问题。这将为您提供更改组件顺序的快速简便方法

    另一种解决方案是直接将叠加组件添加到参考底图组件的顶部

    enter image description here

    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();
            }
        }
    
    }