Java 如何删除JFrame边框以使图像接触到边缘

Java 如何删除JFrame边框以使图像接触到边缘,java,swing,graphics,jframe,border,Java,Swing,Graphics,Jframe,Border,我让一个朋友为我制作的程序制作背景,这样它就不会看起来那么简单,我认为放置图像的最好方法是制作一个JLabel,用图像填充,然后将其设置为屏幕大小。这工作得很好,除了JFrame周围有一个小边框,我无法让JLabel接触框架的边缘。思想?我附上了一张照片 public class ProgramDriver extends JFrame { private JPanel contentPane; private static CardLayout cardLayout; private JTe

我让一个朋友为我制作的程序制作背景,这样它就不会看起来那么简单,我认为放置图像的最好方法是制作一个JLabel,用图像填充,然后将其设置为屏幕大小。这工作得很好,除了JFrame周围有一个小边框,我无法让JLabel接触框架的边缘。思想?我附上了一张照片

public class ProgramDriver extends JFrame {

private JPanel contentPane;
private static CardLayout cardLayout;
private JTextField addGradeN;
private JTextField addGradeD;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                ProgramDriver frame = new ProgramDriver();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

//Global Variables 
...
    manager = new StateManager(gb);

    //JFrame Settings
    setTitle("Grade Book");
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    setBounds(100, 100, 656, 530);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    cardLayout = new CardLayout(0,0);
    contentPane.setLayout(cardLayout);
    setResizable(false);

    //Home Panel 
    final JPanel Home = new JPanel();
    contentPane.add(Home, "Home");
    Home.setLayout(null);

    JButton btnSeeGrades = new JButton("See Grades");
    ...

    //Grades Panel
    JPanel Grades = new JPanel();
    contentPane.add(Grades, "Grades");
    Grades.setLayout(null);'


另一种选择是,您可以覆盖(contentPane)的方法并在对象上使用,如中所示。

您是否尝试过JFrame函数setUndercorated()?

要扩展Eng.Fouad的答案,您需要使用
drawImage(…)
方法,该方法包含6个参数,图像、x和y位置、图像宽度和高度,和图像观察者,从JPanel中这样绘制:

g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
例如,我的:

编辑

我看到您在contentPane周围使用了一个EmptyBorder。如果您不希望出现此边框,为什么?

问题不在于
JFrame
,而在于您的代码。我们可以把余生都花在猜测错误上,也可以发布一些示例代码

现在取决于你们,我们可以不断地向你们抛出一个又一个错误的猜测,让我们所有人失望,或者你们可以帮助我们帮助你们

下面是我做的两个例子。第一个使用
JLabel
作为
JPanel
的主要内容,子组件放置在其上。又好又简单

第二种方法使用自定义的
JPanel
,将图像绘制到组件的背景上。然后我用它来替换框架内容窗格。这有点复杂,但它还有一个额外的好处,就是可以轻松更新(替换内容窗格不会影响程序的其余部分)

示例1:
JLabel
用作背景

public class TestBackground {

    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg";

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

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

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new LabelPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });

    }

    protected class LabelPane extends JPanel {

        public LabelPane() {

            BufferedImage bg = null;
            try {
                bg = ImageIO.read(new File(BACKGROUND_PATH));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            JLabel label = new JLabel(new ImageIcon(bg));
            setLayout(new BorderLayout());

            add(label);

            label.setLayout(new GridBagLayout());

            JLabel lblMessage = new JLabel("Look at me!");
            lblMessage.setForeground(Color.WHITE);
            lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48));

            label.add(lblMessage);

        }
    }
}

示例2:图像用作背景,替换内容窗格

public class TestBackground {
    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg";

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

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

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class BackgroundPane extends JPanel {

        private BufferedImage bg = null;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File(BACKGROUND_PATH));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            setLayout(new GridBagLayout());

            JLabel lblMessage = new JLabel("Look at me!");
            lblMessage.setForeground(Color.WHITE);
            lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48));

            add(lblMessage);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg != null) {
                g.drawImage(bg, 0, 0, this);
            }
        }
    }
}


使框架不装饰<代码>帧。设置未装饰(真)

如果您想让它移动,可以使用Java2S的
ComponentMover

确保在其可见之前未进行装饰

接下来,使用setContentPane(新的JLabel(新的图像图标(“myimage.jpg”))


之后,您可以像往常一样添加内容。

您确定图像大小与屏幕大小匹配吗?如果不允许,您是否允许图像扩展或收缩?考虑创建和发布一个演示给我们的问题。<代码> jLabeleBase=新jLabor(“新标签”);setIcon(新的ImageIcon(ProgramDriver.class.getResource(“/Pictures/GB_Blue.jpg”));背景:挫折(0,0652496);添加(背景)请不要在评论中发布代码,因为它们几乎不可读。将其作为问题的编辑发布。但是你发布的代码似乎没有扩展图像,所以你有边框对我来说并不奇怪。Eng的答案可能最有效,对他来说是1+。通过扩展,我想你的意思是这是JLabel的一个限制,我必须使用drawImage,因为“扩展”不仅仅是对标签的简单修改。至于代码,你完全正确。我根本看不懂。对不起,我没意识到结果会是这样。为未来着名可能的复制品能让我避开边境吗?谢谢,我要试试这个。如何从文件中获取BuffereImage。我在包中有一个。@user1419623:您可以使用ImageIO.read,它可以获取InputStream,您可以通过调用
getClass().getResourceAsStream(pathToImage)
以InputStream的形式获取文件。请注意,pathToImage将与类文件相关。这是非常重要的。我有点困惑,你的示例格式如何与我的格式相匹配。我在上面只发布了必要的代码行(显然),正如您所看到的,我基本上是在创建面板、面板和面板…@user1419623:我看到您在contentPane周围使用了一个EmptyBorder。如果你不希望这个边界出现,为什么?@user1419623上次你发布这个问题时,我告诉过你有某种边界!你的博客链接与问题的确切主题不符,你也没有指明你链接的是你自己的博客。我正在删除链接,因为它似乎与理解您的答案无关。如果你把它加回去,你必须披露它是你的网站,并说明为什么它与问题的主题直接相关。
public class TestBackground {
    public static final String BACKGROUND_PATH = "/Volumes/Macintosh HD2/Dropbox/MT015.jpg";

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

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

                JFrame frame = new JFrame("Testing");
                frame.setLayout(new BorderLayout());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setContentPane(new BackgroundPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected class BackgroundPane extends JPanel {

        private BufferedImage bg = null;

        public BackgroundPane() {
            try {
                bg = ImageIO.read(new File(BACKGROUND_PATH));
            } catch (IOException ex) {
                ex.printStackTrace();
            }

            setLayout(new GridBagLayout());

            JLabel lblMessage = new JLabel("Look at me!");
            lblMessage.setForeground(Color.WHITE);
            lblMessage.setFont(lblMessage.getFont().deriveFont(Font.BOLD, 48));

            add(lblMessage);
        }

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (bg != null) {
                g.drawImage(bg, 0, 0, this);
            }
        }
    }
}