Java 在玻璃窗格上绘制图形

Java 在玻璃窗格上绘制图形,java,swing,glasspane,Java,Swing,Glasspane,我目前正在制作一个版本的棋盘游戏Khet,并计划使用玻璃窗格显示在回合之间发射的激光,但就我的一生而言,我根本无法让图纸显示出来。为了保存发布游戏的所有代码,我只发布了与玻璃窗格相关的代码,因为它是下面单独的应用程序。有人能告诉我为什么图形没有显示出来吗 package glasspane; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics

我目前正在制作一个版本的棋盘游戏Khet,并计划使用玻璃窗格显示在回合之间发射的激光,但就我的一生而言,我根本无法让图纸显示出来。为了保存发布游戏的所有代码,我只发布了与玻璃窗格相关的代码,因为它是下面单独的应用程序。有人能告诉我为什么图形没有显示出来吗

package glasspane;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Line2D;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class GlassPane {

    JPanel panel, glass;

    GlassPane() {
        JFrame f = new JFrame("GlassPane");

        panel = new JPanel();
        JButton show = new JButton("Show glass");
        JButton hide = new JButton("Hide glass");
        show.addActionListener(e -> changeVisibility());
        hide.addActionListener(e -> changeVisibility());
        panel.add(show);
        panel.add(hide);

        glass = (JPanel) f.getGlassPane();
        glass.add(new line());
        glass.setVisible(false);

        f.add(panel);
        f.setSize(300, 300);
        f.setVisible(true);
    }

    private void changeVisibility() {
        glass.setVisible(!glass.isVisible());
        panel.repaint();
    }

    @SuppressWarnings("serial")
    private class line extends JComponent {
        public void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(
                RenderingHints.KEY_ANTIALIASING, 
                RenderingHints.VALUE_ANTIALIAS_ON);

            Shape s = new Line2D.Float(0, 0, 300, 300);
            g2.setColor(Color.GREEN);
            g2.setStroke(new BasicStroke(20));
            g2.draw(s);
            System.out.println("doing something...");
        }
    }

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

}

我这样做了,就出现了这样一句话:

    glass = (JPanel) f.getGlassPane();
    glass.setLayout(new BorderLayout());
    glass.add(new line());
线组件的大小为零。这是因为JFrame.getGlassPane返回一个没有默认layoutManager的java.awt.Component。因此,为您的glassPane设置layoutManager应该可以解决您的问题

glass = (JPanel) f.getGlassPane();
glass.setLayout(new BorderLayout());
glass.add(new line(), BorderLayout.CENTER);
glass.setVisible(false);

现在,您的线路组件应该和工作正常的玻璃面板一样大!非常感谢。您能解释一下为什么需要将布局设置为BorderLayout,以及为什么默认的FlowLayout没有显示任何内容吗?感谢您的解释,特别是关于无默认layoutManager.JRootPane rootPane=SwingUtilities.getRootPanef;然后是rootPane.setGlassPaneglass;私有类行扩展JComponent{应该是不透明的