Как преобразовать JGraph в стеклянную панель?

У меня есть класс :public class GraphEditorPane extends JGraph

и я использую этот "GraphEditorPane" следующим образом:

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

Я использую этот GraphEditorPane, чтобы нарисовать на нем график. Теперь мой вопрос: есть ли способ преобразовать этот JGraph в стеклянную панель, чтобы моя «GraphEditorPane» была прозрачной, и я все еще мог рисовать поверх нее?


person voidMainReturn    schedule 23.05.2013    source источник
comment
Стеклянная панель — это просто Component. Пока JGraph простирается от Component (прямо или косвенно), вы должны иметь возможность установить его в качестве стеклянной панели корневых панелей. Стеклянная панель будет закрашена поверх содержимого корневой панели, а это означает, что если вы уже не рисуете непосредственно поверх компонента JGraph (т. е. переопределяете метод paintComponent или добавляете компоненты непосредственно к нему), то больше ничего не закрашиваете.   -  person MadProgrammer    schedule 23.05.2013
comment
а как установить его как корневую стеклянную панель? Насколько я знаю, корневые панели стеклянные панели — это совершенно другой компонент, верно?   -  person voidMainReturn    schedule 23.05.2013
comment
И я хочу рисовать поверх компонента JGraph   -  person voidMainReturn    schedule 23.05.2013
comment
JRootPane#setGlassPane, чтобы установить свой собственный (помните, что если компонент не прозрачен, он закроет все остальное). Если вы используете стеклянную панель таким образом, она будет отображаться поверх всего остального, если только вы не рисуете непосредственно на ней или не добавляете к ней компоненты. Вместо этого вы можете использовать JLayerdPane.   -  person MadProgrammer    schedule 23.05.2013
comment
JLayerdPane используется для другой цели, и я не хочу его использовать. Я просто хочу, чтобы моя панель прокрутки была либо прозрачной, либо стеклянной, чтобы я мог разместить 2 панели прокрутки друг над другом, сделать одну из них прозрачной, чтобы видеть изображение и текст на панели ниже, и рисовать графики над верхней панелью также. Это кажется немного запутанным, но это то, как это должно работать.   -  person voidMainReturn    schedule 23.05.2013
comment
Почему бы просто не добавить один компонент к другому?   -  person MadProgrammer    schedule 23.05.2013
comment
Я сделал, но есть проблемы с прозрачностью, если вы добавите два JScrollPanes друг на друга. Я пробовал это. Я даже пытался сделать viewPort непрозрачным, но это не сработало.   -  person voidMainReturn    schedule 23.05.2013
comment
Не добавляйте панели прокрутки вместе, добавьте две панели графика вместе...   -  person MadProgrammer    schedule 23.05.2013


Ответы (1)


Я думаю, вы слишком все усложняете.

Стеклянная панель будет самым верхним компонентом (когда она видна), рисуя поверх всего остального. Если вы просто хотите "наложить" один компонент на другой, есть гораздо более простые решения...

Самая простая идея, которую я могу придумать, это использовать JLayeredPane, настроив его на использование GridBagLayout, чтобы вам не нужно было беспокоиться о позиционировании дочерних компонентов. Это даст вам быстрые и простые методы изменения порядка компонентов.

Другим решением было бы просто добавить компонент наложения непосредственно поверх компонента подложки.

введите здесь описание изображения

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