当前位置: 首页 > 知识库问答 >
问题:

Java-在NullLayoutManager中将JComponent放在图形前面?

谯德佑
2023-03-14

我在一个有图形的JPanel中有一个JButton,但是这个按钮不会显示在图形下面的层中。我已经读过了:把JLabel放在JPanel中的图形2D矩形前面

但答案告诉我不要使用NullLayoutManager。有没有办法用NullLayoutManager来做这件事,因为我需要在我的JPanel中专门定位我的JButton?如果这是不可能的,有没有其他的方法,我可以把一个JComponent定位在一个位置x,y?我也在谷歌上搜索了一下,发现NullLayoutManager是万维网提供给我的。

代码:

    JPanel p = new JPanel(){

        @Override
        public void paintComponent(Graphics gr){
            Graphics2D g = (Graphics2D) gr;
            g.setColor(Color.BLACK);
            g.fillRect(0, 0, 800, 800);
            g.setFont(titlefont);
            g.setColor(Color.WHITE);
            g.drawString("dont steal my game idea plz", 25, 100);
            g.drawImage(bi, 138, 70, null);
            repaint();
        }

    };
    p.setLayout(null);





    JButton b = new JButton("PLAY");
    b.setLocation(100, 200);
    b.setFont(ufont);




    f.add(p);
    p.add(b);

共有1个答案

刘高驰
2023-03-14

有没有办法用NullLayoutManager来做这件事,因为我需要在我的JPanel中专门定位我的JButton?

答案是“是的”,但您了解布局管理器实际上是做什么的吗?它们是如何工作的,以及它们所扮演的角色,以取代它们并接管它们的功能需求?

null布局不是一个好主意,有太多的东西可能会出错,只是想着它就会让人头脑麻木。如果没有一个常用的布局管理器可以完成您想要的任务,可以考虑使用MigLayout或其他布局管理器,甚至可以编写您自己的布局管理器,至少这样,您仍然可以在API中工作,该API是为布局管理器设计的。

还有一些其他的问题,首先,你是在画完文字后画你的图像,这可能会导致一些问题,如果这两个重叠。其次,您没有调用super.paintcomponent就破坏了油漆链,这可能会导致一些意外和不想要的结果。第三,您不需要填充组件,使用setbackground并让super.PaintComponent来处理它。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DownWithNullLayouts {

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

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

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Font titlefont;
        private BufferedImage bi;

        public TestPane() {
            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.insets = new Insets(30, 0, 0, 0);
            add(new JButton("Play"), gbc);
            try {
                bi = ImageIO.read(...);
            } catch (IOException ex) {
                ex.printStackTrace();
            }
            titlefont = UIManager.getFont("Label.font");
            setBackground(Color.BLACK);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            int x = (getWidth() - bi.getWidth()) / 2;
            int y = (getHeight()- bi.getHeight()) / 2;
            g2d.drawImage(bi, x, y, this);
            g2d.setFont(titlefont);
            g2d.setColor(Color.WHITE);
            g2d.drawString("dont steal my game idea plz", 25, 100);
            g2d.dispose();
        }

    }

}

在AWT和Swing中仔细查看绘画并执行自定义绘画以了解更多细节

 类似资料:
  • 我在互联网上搜索了如何将JButtons拖放到对象的示例,但我无法使其工作。 我的程序所做的是,当我单击一个按钮时,对象更新了一个字段(使用selectedobject.setField())。我希望能够通过拖动JButton而不是单击来做到这一点。 我该怎么做?我找到了这个,并试图输入我的代码: 我从这里参加了ImageHandler课程。

  • 我在向JPanel添加图形时遇到了问题。如果我从panel.add(new graphics())中更改行;添加(new graphics());并且不将JPanel添加到JFrame,黑色矩形将出现在JFrame上。我只是不能让黑色矩形出现在JPannel上,想知道是否有人能帮我做这件事。

  • 我开始制作一个mandelbrot集分形查看器。在放大分形时,我遇到了很多问题。如果您尝试缩放,查看器将刚好靠近中心。我已经尽我所能去理解这个困境。我怎样才能放大我的分形,当我放大时,它会放大屏幕的中心,而不是分形的中心?

  • 主要内容:1 Java JComponent的介绍,2 Java JComponent的字段,3 Java JComponent的构造方法,4 Java JComponent的方法,5 Java JComponent的案例1 Java JComponent的介绍 JComponent类是除顶层容器之外的所有Swing组件的基类。名称以“ J”开头的Swing组件是JComponent类的后代。例如,JButton,JScrollPane,JPanel,JTable等。但是,JFrame和JDia

  • 问题内容: 我在向JPanel添加图形时遇到问题。如果我更改从panel.add(new graphics()); 到frame.add(new graphics()); 并且不要将JPanel添加到JFrame,黑色矩形会出现在JFrame上。我只是无法让黑色矩形出现在JPannel上,并且想知道是否有人可以帮助我。 问题答案: 自定义组件为0x0 px。

  • 我目前正在从事一个股票市场项目,教学生如何与股票市场互动。我现在正在研究的一个问题围绕着效率和记忆力的问题。我在Adobe illustrator中制作了所有2D图标(例如设置图标,投资组合图标等),我将这些文件导出为png文件,并将它们放入我的程序中。我目前使用 JavaFX,JavaFX 的一个功能是所谓的图像视图,这是一种处理图像打开和查看的方法。 假设用户想在游戏中按下设置图标,当用户悬停