【问题标题】:Drawing a graphic on Glass Pane在 Glass Pane 上绘制图形
【发布时间】:2016-01-07 13:33:07
【问题描述】:

我目前正在制作棋盘游戏 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();
    }

}

【问题讨论】:

    标签: java swing glasspane


    【解决方案1】:

    您的line 组件大小为零。那是因为JFrame.getGlassPane() 返回一个没有默认布局管理器的java.awt.Component。所以为你的 glassPane 设置一个 layoutManager 应该可以解决你的问题。

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

    现在你的 line 组件应该和 glassPane 一样大

    【讨论】:

    • 感谢您的解释,尤其是关于没有默认的 layoutManager。
    • JRootPane rootPane = SwingUtilities.getRootPane(f); 然后 rootPane.setGlassPane(glass); 和 private class line extends JComponent { 应该是不透明的
    【解决方案2】:

    我这样做了,这条线出现了:

        glass = (JPanel) f.getGlassPane();
        glass.setLayout(new BorderLayout());
        glass.add(new line());
    

    【讨论】:

    • 成功了!谢谢!能否解释一下为什么需要将布局设置为 BorderLayout,以及为什么默认(FlowLayout)什么都不显示?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2019-07-15
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多