【问题标题】:Weird white border at bottom of JPanelJPanel 底部奇怪的白色边框
【发布时间】:2018-12-30 23:24:17
【问题描述】:

我的屏幕底部有一个奇怪的白色边框。它在左下角,也就是TimeView.java

这是我的 ContentPane.java

package views;

import java.awt.BorderLayout;

import javax.swing.BoxLayout;
import javax.swing.JPanel;

public class ContentPane extends JPanel {

private static final long serialVersionUID = 1L;

private GameView gameView;
private PlayView playView;
private TimeView timeView;

public ContentPane() {      
    this.setLayout(new BorderLayout());
}

public void setGameView(GameView gameView, PlayView playView, TimeView timeView) {
    this.gameView = gameView;
    this.playView = playView;
    this.timeView = timeView;

    JPanel subPanel = new JPanel();
    subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.Y_AXIS));
    subPanel.add(gameView);
    subPanel.add(timeView);

    this.add(playView, BorderLayout.CENTER);
    this.add(subPanel, BorderLayout.WEST);
}

}

这是 GameView.java

package views;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JPanel;

public class GameView extends JPanel {

private static final long serialVersionUID = 1L;

public GameView() {
    this.setBackground(Color.decode("#2A2828"));
    this.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.GRAY));
    this.setPreferredSize(new Dimension(200, 300));
}

}

这是 TimeView.java

package views;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class TimeView extends JPanel {

private static final long serialVersionUID = 1L;

public TimeView() {
    this.setBackground(Color.decode("#2A2828"));
    this.setPreferredSize(new Dimension(200, 500));
}
}

这是 PlayView.java

package views;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JPanel;

public class PlayView extends JPanel {

private static final long serialVersionUID = 1L;

public PlayView() {
    this.setBackground(Color.decode("#1F1F40"));
    this.setPreferredSize(new Dimension(1100, 800));
}

}

我已经尝试在 TimeView 上放置一个空边框,但仍然会出现奇怪的白色边框。

如果有人可以向我解释导致此问题的原因,那就太好了。

编辑:

这是 MainFrame.java

package views;

import javax.swing.JFrame;

public class MainFrame extends JFrame {

private static final long serialVersionUID = 1L;

public void setupGui(ContentPane contentPane) {
    this.setTitle("TagMan By Jesse");
    this.setContentPane(contentPane);
    this.setSize(1300, 800);
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setLocationRelativeTo(null);
    this.setResizable(false);
}

}

【问题讨论】:

  • 你能把调用 setVisible(true) 的代码贴在 JFrame 上吗?
  • @BabaNew 我已经编辑了我的帖子。
  • setSize 之后调用this.setResizable(false); 是您的主要问题,尽管依赖setSize 也是一个坏主意
  • @MadProgrammer 我已经删除了this.setResizable(false);,但问题仍然存在。为什么我不应该使用setSize btw?
  • @idontunderstandarrays 您不应该使用setSize,因为可用的内容大小是窗口大小减去装饰。您应该使用布局管理 API 和 Window#pack,它将以首选大小“打包”内容周围的窗口。据我了解,您“可能”是int 舍入的受害者,其中(类似于BoxLayout)正在尝试计算可用空间,并产生一个浮点值,然后将其舍入为@987654337 @自动......这一切都只是一团糟

标签: java swing


【解决方案1】:

在许多操作系统中,使窗口不可调整大小会改变框架装饰,从而影响可用的内容空间。不过,这往往不会使容器无效,这可能会导致少量额外空间未被使用。

在设置大小或使窗口可见之前,您应该调用setResizable

另外,因为“可用”空间是“窗口大小”减去“框架装饰”,所以您不应该依赖setSize,相反,您应该允许窗口和布局管理器 API 做出此决定为您服务,只需调用pack,它将围绕内容首选大小打包窗口,例如...

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

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

    public Test() {
        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 ContentPane());
                frame.setResizable(false);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ContentPane extends JPanel {

        private static final long serialVersionUID = 1L;

        private GameView gameView;
        private PlayView playView;
        private TimeView timeView;

        public ContentPane() {
            this.setLayout(new BorderLayout());
            setGameView(new GameView(), new PlayView(), new TimeView());
        }

        public void setGameView(GameView gameView, PlayView playView, TimeView timeView) {
            this.gameView = gameView;
            this.playView = playView;
            this.timeView = timeView;

            JPanel subPanel = new JPanel();
            subPanel.setLayout(new BoxLayout(subPanel, BoxLayout.Y_AXIS));
            subPanel.add(gameView);
            subPanel.add(timeView);

            this.add(playView, BorderLayout.CENTER);
            this.add(subPanel, BorderLayout.WEST);
        }

    }

    public class GameView extends JPanel {

        private static final long serialVersionUID = 1L;

        public GameView() {
            this.setBackground(Color.decode("#2A2828"));
            this.setBorder(BorderFactory.createMatteBorder(0, 0, 5, 0, Color.GRAY));
            this.setPreferredSize(new Dimension(200, 300));
        }

    }

    public class TimeView extends JPanel {

        private static final long serialVersionUID = 1L;

        public TimeView() {
            this.setBackground(Color.decode("#2A2828"));
            this.setPreferredSize(new Dimension(200, 500));
        }
    }

    public class PlayView extends JPanel {

        private static final long serialVersionUID = 1L;

        public PlayView() {
            this.setBackground(Color.decode("#1F1F40"));
            this.setPreferredSize(new Dimension(1100, 800));
        }

    }
}

我也不鼓励使用setPreferredSize 来支持覆盖getPreferredSize,因为setPreferredSize 没有提供合适的方法来“管理”可能发生的任何更改

【讨论】:

  • 我明白了!我删除了setSize 并添加了.pack。我将如何去做getPreferredSize 而不是setPreferredSize。非常感谢人:)
  • 只需将public Dimension getPreferredSize() {...}添加到每个类并返回您要使用的Dimension(而不是使用setPreferredSize
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多