【问题标题】:How to load two extended JPanel class to one JFrame?如何将两个扩展的 JPanel 类加载到一个 JFrame?
【发布时间】:2014-01-26 00:47:36
【问题描述】:

我打算用 Java 制作一个游戏,我的游戏会有一个菜单。菜单有背景和 2 个JLabel 对象。我已经将它们放在单独的类中,传递给一个JFrame。我的问题是,我在一个框架上加载了 2 个,但其中一个总是被另一个隐藏。

这是代码:

JFrame 类

@SuppressWarnings("serial")
public class Sistem extends JFrame{
private final int lebar=954;
private final int tinggi=540;
private Image bg;
File gbr=new File("res/a.jpg");

public Sistem(){
    this.setTitle("Unknown man Unkown power");
    this.setSize(new Dimension(lebar,tinggi));
    this.setFocusable(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setResizable(false);
    this.setContentPane(new Ngrep());
    //this.setContentPane(new Menu());


    this.setVisible(true);
    //loadfont();
    //loadbg();

}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            new Sistem();
        }
    });
}

}

背景类

@SuppressWarnings("serial")
public class Ngrep extends JPanel{
private int l=954;
private int t=540;
private BufferedImage bg;
File gbr=new File("res/a.jpg");

public Ngrep(){
    loadbg();

}

private void loadbg() {
    // TODO Auto-generated method stub
    try {
        bg=ImageIO.read(gbr);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
public void paint(Graphics g) {
    // TODO Auto-generated method stub
    super.paint(g);
    g.drawImage(bg, 0, 0, l, t, null);
}

}

菜单类

@SuppressWarnings("serial")
public class Menu extends JPanel implements Runnable,KeyListener{
private int l=954;
private int t=540;
JLabel menu1=new JLabel("MULAI BARU");
JLabel menu2=new JLabel("KELUARRR");
private File fo=new File("res/Mawns.ttf");
JLayeredPane p=new JLayeredPane();

public Menu(){
    loadfont();

    this.add(menu1);
    this.add(menu2);
}


public void loadfont(){
    try {
        FileInputStream fi=new FileInputStream(fo);
        Font f=Font.createFont(Font.TRUETYPE_FONT, fi).deriveFont(Font.TRUETYPE_FONT, 30);
        GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();

        ge.registerFont(f);

        menu1.setFont(f);
        menu2.setFont(f);

    } catch (Exception ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }
    p.setLayout(new GridLayout(2, 3));

    menu1.setBounds(0, 0, getWidth(), getHeight());
    menu2.setBounds(0, 0+menu1.getHeight(), getWidth(), getHeight());

    p.add(menu1, 2);
    p.add(menu2, 2);
}


}

我想要的是菜单在背景前面,但仍然可以看到背景。以及如何将我创建的JLabel 安排在屏幕的中心位置。

如何实现所需的布局?

【问题讨论】:

    标签: java image swing jpanel paint


    【解决方案1】:

    首先使用JFrame#add 而不是JFrame#setContentPane,除非您打算向该(内容)窗格添加更多组件。

    默认情况下JFrame 使用BorderLayout 作为其LayoutManager。您需要将其更改为您喜欢使用的内容,或者将每个组件添加到 BorderLayout 中的适当位置

    详情请见Laying Out Components Within a Container

    【讨论】:

    • 正如我所说,默认布局管理器JFrameBorderLayout。如果添加两个组件并指定位置,它们将被添加到CENTER 位置,但只会显示最后一个。查看链接了解更多详情...
    【解决方案2】:
    public class Ngrep extends JPanel{
    

    请注意,由于Ngrep JPanel,您可以直接向其中添加组件,从而使Menu 类变得多余。

    在这个 SSCCE 中看到的东西。

    请注意,我最终以如此之快的速度做出了如此多的更改,以至于我懒得明确记录其中的大部分内容。仔细查看代码,与原始代码核对,检查 Java Docs,如果有任何不明白的更改,请询问我。

    import java.awt.*;
    import java.awt.image.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.net.URL;
    import javax.imageio.ImageIO;
    
    @SuppressWarnings("serial")
    public class Sistem extends JFrame {
    
        public Sistem() {
            this.setTitle("Unknown man Unkown power");
            this.setFocusable(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setContentPane(new Ngrep());
            this.setResizable(false);
            this.pack();
    
            this.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new Sistem();
                }
            });
        }
    }
    
    @SuppressWarnings("serial")
    class Ngrep extends JPanel {
    
        private int l = 375;
        private int t = 150;
        private BufferedImage bg;
        JLabel menu1 = new JLabel("MULAI BARU");
        JLabel menu2 = new JLabel("KELUARRR");
    
        public Ngrep() {
            this.add(menu1);
            this.add(menu2);
    
            try {
                Font f = new Font(Font.MONOSPACED, Font.ITALIC, 30);
                menu1.setFont(f);
                menu1.setForeground(Color.RED);
                menu2.setFont(f);
                menu2.setForeground(Color.RED);
                URL url = new URL("http://i.stack.imgur.com/OVOg3.jpg");
                bg = ImageIO.read(url);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            setLayout(new GridLayout(2, 3));
    
            add(menu1);
            add(menu2);
        }
    
        public Dimension getPreferredSize() {
            return new Dimension(l, t);
        }
    
        /*
         * For a JComponent, override paintComponent rather than paint
         */
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            // a JPanel IS AN ImageObserver
            g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
        }
    }
    

    【讨论】:

    • 我试过了,但它仍然只显示 BufferedImage。是不是ImageIO不能重叠?
    • 我只是发现我的错,我使用“paint()”而不是“paintComponent()”谢谢你,
    • 很高兴你把它整理好了。 :)
    【解决方案3】:

    解决了,因为我发现我使用的是paint() 而不是paintComponent()。 像这样:

    @Override
    public void paint(Graphics g) {
    // TODO Auto-generated method stub
    super.paint(g);
    g.drawImage(bg, 0, 0, l, t, this);
    }
    

    到这里:

    @Override
    public void paintComponent(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponents(g);
    
    g.drawImage(bg, 0, 0, l, t, this);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多