【问题标题】:java Gap between jframe and ImagePaneljava jframe和ImagePanel之间的差距
【发布时间】:2012-06-08 20:28:27
【问题描述】:

我有一个添加三个对象的 JLayeredPane,问题是应用程序运行时的 backgroundImage 有 jframe 和顶部的背景图像之间的间隙,无论如何我都设置为 (0,0)我改变的差距仍然存在(我想摆脱差距)。如果我复制 backgroundImage 类并将其放在另一个文件/类中,则间隙不存在。谁能帮忙?

public class NavigationMenu extends JPanel {

private ArrayList<String> Menu = new ArrayList();
private int MenuSize;
private int MenuChannel = 0;
private Font realFont;
private static Dimension screenSize = new Dimension(new ScreenDimensions().getScreenWidth(), new ScreenDimensions().getScreenHeight());
private static final int MENU_HEIGHT = (int)(new ScreenDimensions().getScreenHeight()*0.1);
private static final int MENU_WIDTH = new ScreenDimensions().getScreenWidth();
private static final int MENU_CENTER = (new ScreenDimensions().getScreenHeight() / 2) - (MENU_HEIGHT / 2);

public NavigationMenu() {

    //Add Menu Channels
    setPreferredSize(screenSize);
    setBounds(0,0,MENU_WIDTH,screenSize.height);
    this.Menu.add("MOVIES");
    this.Menu.add("MUSIC");
    this.Menu.add("PICTURES");
    this.Menu.add("VIDEOS");
    this.Menu.add("TV SHOWS");
    this.Menu.add("WEATHER");
    this.Menu.add("RADIO");
    this.Menu.add("SETTINGS");
    this.MenuSize = Menu.size() - 1;

    JLayeredPane pfinal = new JLayeredPane();
    JPanel _menuText = new menuText();
    JPanel _backgroundImage = new backgroundImage("Backgrounds/curtains.png");
    JPanel _bar = new bar();

    pfinal.setPreferredSize(screenSize);
    pfinal.setBounds(0,0,MENU_WIDTH,screenSize.height);

    pfinal.add(_backgroundImage, new Integer(1));
    pfinal.add(_bar, new Integer(2));
    pfinal.add(_menuText, new Integer(3));

    add(pfinal);
}

public class bar extends JPanel {
    public bar() {
        setBounds(0,MENU_CENTER,MENU_WIDTH, MENU_HEIGHT);
        setOpaque(false);
    }
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f));
        g2d.setColor(Color.BLACK);
        g2d.fillRect(0,0,screenSize.width,MENU_HEIGHT);
    }
}

public class menuText extends JPanel {

    public menuText() {
        setBounds(0,MENU_CENTER,MENU_WIDTH,MENU_HEIGHT);
        setOpaque(false);
        setFocusable(true);
        requestFocusInWindow();

        try {
            realFont = new RealFont(((int)(MENU_HEIGHT * 0.80))).getRealFont();
        } catch (Exception e) {
            System.out.println(e.toString());
        }
        addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //JOptionPane.showMessageDialog(null, "OK");
                int keyCode = e.getKeyCode();
                    switch (KeyEvent.getKeyText(keyCode)) {
                        case "Up":
                            //JOptionPane.showMessageDialog(null, "Up");
                            if(MenuChannel < MenuSize) {
                                MenuChannel++; 
                                repaint();
                            } else {
                                MenuChannel = 0; //reset
                                repaint();
                            }
                        break;
                        case "Down":
                            if(MenuChannel == 0) {
                                MenuChannel = MenuSize + 1;
                                MenuChannel--;
                                repaint();
                            } else {
                                MenuChannel--;
                                repaint();
                            }   
                        break;
                    }
            }
        });
    }

    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        String MenuString = Menu.get(MenuChannel);
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //g2d.setBackground(Color.PINK);
        //g2d.fillRect(0,0,getWidth(),getHeight());
        g2d.setColor(Color.WHITE);
        g2d.setFont(realFont);
        FontRenderContext context = g2d.getFontRenderContext();
        java.awt.geom.Rectangle2D rect = realFont.getStringBounds(MenuString, context);
        int textHeight = (int)rect.getHeight();
        int textWidth = (int)rect.getWidth();
        int panelHeight = getHeight();
        int panelWidth = getWidth();
        int x = (panelWidth - textWidth) / 2;
        int y = (panelHeight - textHeight) / 2;
        //System.out.println("f:"+ fontMetrics.gettH:" + textHeight + "\ntW:" + textWidth + "\npH:" + panelHeight + "\npW:" + panelWidth);
        g2d.drawString(MenuString,x,(float)-rect.getY()+2);
    }
}

public class backgroundImage extends JPanel {

    private Image icon;
    private int screenWidth = new ScreenDimensions().getScreenWidth();
    private int screenHeight = new ScreenDimensions().getScreenHeight();

    public backgroundImage(String background) {
        icon = new ImageIcon(background).getImage();
        Dimension size = new Dimension(screenWidth,screenHeight);
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
        setLayout(null);

    }

    @Override
    protected void paintComponent(Graphics g) {
        g.drawImage(icon,0,0,screenSize.width,screenSize.height,null);
    }
}
}

【问题讨论】:

  • 你能做一个截图来形象化吗?我运行您的代码,系统 WindowManager 顶部栏和 JFrame 内容之间没有间隙 - 您的 NavigationMenu
  • 呃,我不能发布任何图像,直到我有一个大于 10 的代表,无论如何,当我向根 jframe 添加更多面板时,我注意到它们不断移动(5,5)左右像素.
  • 现在你可以上传图片了;)
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) setLayout(null); 不要那样做。
  • 对于 AbsoluteLayout,您必须使用返回其父级的 Insets

标签: java swing jframe jpanel gaps-in-visuals


【解决方案1】:

将 NavigationMenu 的布局更改为 BorderLayout

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多