【问题标题】:JPanel Smaller than JFrameJPanel 小于 JFrame
【发布时间】:2015-03-18 16:12:34
【问题描述】:

我从未真正创建过JPanel,但我的JFrame 内部似乎遇到了问题。我的“fball”对象随机出现在屏幕上,我无法弄清楚为什么我的生活。我实际上并没有创建JPanel 并使用这些方法来设置它,并且不知道该怎么做,因为我的扩展JPanel 的类只创建了一个图像。如果你帮助我,我会永远爱你。 (对于我缺乏Java知识,我深表歉意)

这是我的窗口类的代码:

    package game.thirdTry;

import java.awt.BorderLayout;
import java.awt.Graphics;

import javax.swing.JFrame;

public class Window extends JFrame {

    private static Window instance;
    public static Window getInstance() {
        if(instance == null) {
            instance = new Window("Game");
        }
        return instance;
    }
    private Window(String name) {
        super(name);
        setSize(1200, 700);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setLayout(null);
        addKeyListener(new UserInput());

        WindowStructure banner = new WindowStructure("Beatles Logo.jpg", 0, 0, getWidth(), 75);
        //WindowStructure fball = new WindowStructure("fireball.100x100.png", 100, 100, 100, 100);

        WindowStructure fball = WindowStructure.getInstanceF();

        System.out.println("Fball.xSize: " + fball.xSize + ", Fball.ySize: " + fball.ySize);
        System.out.println("Fball.xLoc: " + fball.xLoc + ", Fball.yLoc: " + fball.yLoc);
        banner.setBounds(banner.xLoc, banner.yLoc, banner.xSize, banner.ySize);
        fball.setBounds(fball.xLoc, fball.yLoc, fball.xLoc + fball.xSize, fball.ySize + fball.ySize);

        add(fball, null);
        add(banner, null);

        setVisible(true);

        while(true){
            System.out.println("Fball.xLoc: " + fball.xLoc + ", Fball.yLoc: " + fball.yLoc);
            repaint();
            try{
            Thread.sleep(100);
            }catch (Exception e){

            }
        }
    }
/*
    public void paint(Graphics g) {
        super.paintComponents(g);
    }
*/
}

Image Creation Classs (extends JPanel):

    package game.thirdTry;

    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.net.URL;

    import javax.swing.ImageIcon;
    import javax.swing.JPanel;

    public class WindowStructure extends JPanel {

    private static WindowStructure fball;

    public static WindowStructure getInstanceF(){
        if(fball == null){
            fball = new WindowStructure("fireball.100x100.png", 300, 100, 100, 100);
        }
        return fball;
    }
    ImageIcon imageIcon;
    int xLoc, yLoc, xSize, ySize;

    public WindowStructure(String bannerImg, int xLoc, int yLoc, int xSize, int ySize){
        URL bannerImgURL = getClass().getResource(bannerImg);
        imageIcon = new ImageIcon(bannerImgURL);
        this.xLoc = xLoc;
        this.yLoc = yLoc;
        this.xSize = xSize;
        this.ySize = ySize;
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(imageIcon.getImage(), xLoc, yLoc, xSize, ySize, null);
    }
    }

【问题讨论】:

标签: java swing jframe jpanel


【解决方案1】:

我的“fball”对象随机出现在屏幕上,我无法弄清楚为什么我的生活

fball.setBounds(fball.xLoc, fball.yLoc, fball.xLoc + fball.xSize, fball.ySize + fball.ySize);

为什么将“fball”的宽度设置为(位置+大小),高度设置为(大小+大小)?你不要为“横幅”这样做

【讨论】:

  • 横幅对象永远不会移动,因此我从来没有遇到过需要设置其边界的问题。 fball 确实如此,因此边界是(位置,位置 + 尺寸)
  • 等等,你说得对。我修复了它,现在问题解决了。新问题:只有我给“setBounds”的最后一个对象渲染和显示
  • @nicknicknick111,面板是不透明的,因此您添加的最后一个面板将指向第一个面板的顶部。您需要使用setOpaque(...) 方法使面板不透明。不要忘记 accept 解决您的问题的答案,无论是在这个帖子和其他帖子中(正如我在上面已经评论过的)。
  • @nicknicknick111,您可以点击对您帮助最大的答案旁边的“复选标记”。
【解决方案2】:

我看不到您将球移动到哪里,但基本问题可能是,您使用框架的大小而不是框架的内容窗格之一。框架的大小还包括框架顶部的条(带有最小化按钮、标题等)。

【讨论】:

  • 我将如何使用内容窗格
  • JFrame.getContentPane() 返回一个框架的内容窗格
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
相关资源
最近更新 更多