Java JLayeredPane未在顶部添加视图

Java JLayeredPane未在顶部添加视图,java,swing,jlayeredpane,Java,Swing,Jlayeredpane,正在尝试在我的应用程序上创建半透明绘制视图 到目前为止,我有一些东西在玩 paintView //a wrapper class of a JPane. gScrollPane // the area I'm trying to cover layeredPane // the layered pane 这是到目前为止我的代码 layeredPane = new JLayeredPane(); paintView = new PaintView//rest of constructor lay

正在尝试在我的应用程序上创建半透明绘制视图

到目前为止,我有一些东西在玩

paintView //a wrapper class of a JPane.
gScrollPane // the area I'm trying to cover
layeredPane // the layered pane
这是到目前为止我的代码

layeredPane = new JLayeredPane();
paintView = new PaintView//rest of constructor
layeredPane.add(gScrollPane);
layeredPane.add(paintView.getComponent(), new Integer(5));
layeredPane.moveToFront(paintView.getComponent());
出于某种原因,它就是不起作用。getComponent返回一个jPane。所以这不应该是问题所在。我已经把面板做成了红色,不透明的,用于测试,但运气不好。我在文档中遗漏了什么吗

编辑:

所以我没有看到gScrollPane顶部的paintview

getComponent只返回内部包装的窗格。但这并不是真正的问题

我认为这与分层窗格的布局有关。(当前流量)
设置为“长方体”时,图层水平并排排列(paintview左侧,gscrollpane右侧)

很难确切知道出现问题的原因。可能是油漆问题,也可能是布局问题

不要忘记,
JLayeredPane
默认情况下没有布局管理器。您可以使用一个,但我只是简单地重写了
doLayout
方法,并为示例的目的“实现”了我自己的方法

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;

public class TestLayeredPane02 {

    public static void main(String[] args) {
        new TestLayeredPane02();
    }

    public TestLayeredPane02() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.setSize(600, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JLayeredPane {

        private JTextPane tp;

        public TestPane() {
            tp = new JTextPane();

            Reader reader = null;
            try {
                reader = new FileReader(new File("sometextfile.txt"));
                tp.read(reader, "Help");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    reader.close();
                } catch (Exception e) {
                }
            }
            tp.setFont(UIManager.getFont("TextArea.font"));

            JScrollPane scrollPane = new JScrollPane(tp);
            scrollPane.setRowHeaderView(new LineNumberHeader(tp));

            OverLayPane overLayPane = new OverLayPane();

            add(scrollPane, new Integer(0));
            add(overLayPane, new Integer(5));

            moveToFront(overLayPane);
        }

        @Override
        public void doLayout() {
            for (Component comp : getComponents()) {
                comp.setBounds(0, 0, getWidth(), getHeight());
            }
        }

    }

    public class OverLayPane extends JPanel {

        public OverLayPane() {
            setLayout(new BorderLayout());
            try {
                BufferedImage img = ImageIO.read(new File("/path/to/image.png"));
                JLabel label = new JLabel(new ImageIcon(img.getScaledInstance(-1, 200, Image.SCALE_SMOOTH)));
                label.setHorizontalAlignment(JLabel.CENTER);
                label.setVerticalAlignment(JLabel.CENTER);
                add(label);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            setOpaque(false);
            setBackground(new Color(255, 0, 0, 128));
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(getBackground());
            g2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
            g2d.dispose();
        }
    }
    public class LineNumberHeader extends JPanel {

        private JTextPane field;

        public LineNumberHeader(JTextPane field) {
            this.field = field;
            field.getDocument().addDocumentListener(new DocumentListener() {

                @Override
                public void insertUpdate(DocumentEvent e) {
                    revalidate();
                    repaint();
                }

                @Override
                public void removeUpdate(DocumentEvent e) {
                    revalidate();
                    repaint();
                }

                @Override
                public void changedUpdate(DocumentEvent e) {
                    revalidate();
                    repaint();
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            int height = field.getPreferredSize().height;
            Element root = field.getDocument().getDefaultRootElement();
            int lineCount = root.getElementCount();
            FontMetrics fm = getFontMetrics(getFont());
            int width = fm.stringWidth(Integer.toString(lineCount)) + 4;
            return new Dimension(width, height);
        }

        protected void drawLineNumber(Graphics2D g2d, int line, Element element) {
            int startIndex = element.getStartOffset();
            FontMetrics fm = g2d.getFontMetrics();
            String strLine = Integer.toString(line);
            try {
                Rectangle rect = field.modelToView(startIndex);
                int strWidth = fm.stringWidth(strLine);
                g2d.drawString(strLine, getWidth() - 2 - strWidth, rect.y + fm.getAscent());
            } catch (BadLocationException ex) {
                ex.printStackTrace();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();

            Element root = field.getDocument().getDefaultRootElement();
            drawLineNumber(g2d, 1, root);
            for (int index = 0; index < root.getElementCount(); index++) {
                Element element = root.getElement(index);
                drawLineNumber(g2d, index + 1, element);
            }
            g2d.dispose();
        }
    }        
}
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Image;
导入java.awt.Rectangle;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.Reader;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JLayeredPane;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTextPane;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
导入javax.swing.event.DocumentEvent;
导入javax.swing.event.DocumentListener;
导入javax.swing.text.BadLocationException;
导入javax.swing.text.Element;
公共类TestLayeredPane02{
公共静态void main(字符串[]args){
新的TestLayeredPane02();
}
公共TestLayeredPane02(){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
框架。设置尺寸(600400);
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JLayeredPane{
私有jtextp;
公共测试窗格(){
tp=新的JTextPane();
Reader=null;
试一试{
reader=newfilereader(新文件(“sometextfile.txt”);
阅读(读者,“帮助”);
}捕获(例外e){
e、 printStackTrace();
}最后{
试一试{
reader.close();
}捕获(例外e){
}
}
tp.setFont(UIManager.getFont(“TextArea.font”);
JScrollPane scrollPane=新的JScrollPane(tp);
scrollPane.setRowHeaderView(新行号阅读器(tp));
覆盖平面覆盖平面=新覆盖平面();
添加(滚动窗格,新整数(0));
添加(覆盖平面,新整数(5));
向前移动(覆盖平面);
}
@凌驾
公共空间布局(){
对于(组件comp:getComponents()){
复合设置边界(0,0,getWidth(),getHeight());
}
}
}
公共类OverlyPane扩展了JPanel{
公共覆盖层(){
setLayout(新的BorderLayout());
试一试{
buffereImage img=ImageIO.read(新文件(“/path/to/image.png”);
JLabel label=newjlabel(新的图像图标(img.getScaledInstance(-1200,Image.SCALE_SMOOTH));
标签设置水平对齐(JLabel.CENTER);
标签设置垂直对齐(JLabel.中心);
添加(标签);
}捕获(IOEX异常){
例如printStackTrace();
}
设置不透明(假);
挫折背景(新颜色(255,0,0,128));
}
@凌驾
公共维度getPreferredSize(){
返回新维度(200200);
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g.create();
setColor(getBackground());
填充(新矩形(0,0,getWidth(),getHeight());
g2d.dispose();
}
}
公共类LineNumberHeader扩展了JPanel{
私有JTextPane字段;
公用行号阅读器(JTextPane字段){
this.field=字段;
field.getDocument().addDocumentListener(新DocumentListener()){
@凌驾
公共作废插入更新(文档事件e){
重新验证();
重新油漆();
}
@凌驾
公共作废移除更新(文档事件e){
重新验证();
重新油漆();
}
@凌驾
公共作废更改日期(记录事件e){
重新验证();
重新油漆();
}
});
}
@凌驾
公共维度getPreferredSize(){
int height=field.getPreferredSize().heig