Java JFrame底部的白色边缘

Java JFrame底部的白色边缘,java,swing,jframe,Java,Swing,Jframe,我正在使用javaxswing,无法摆脱JFrame底部的这个小小的白色边框。我的JFrame的结构方式是,我向JPanel添加了一组组件(例如按钮、文本字段、标签),然后将它们添加到框架中。我尝试将面板的首选大小设置为所需的尺寸,然后在JFrame上调用pack(),但没有效果。先谢谢你 import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedIma

我正在使用javaxswing,无法摆脱JFrame底部的这个小小的白色边框。我的JFrame的结构方式是,我向JPanel添加了一组组件(例如按钮、文本字段、标签),然后将它们添加到框架中。我尝试将面板的首选大小设置为所需的尺寸,然后在JFrame上调用pack(),但没有效果。先谢谢你

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class SampleGUI {
    JFrame frame;
    JPanel panel;
    JLabel label;
    JTextField field;

    public SampleGUI()
    {
        this.frame = new JFrame();
        this.panel = new JPanel();
        this.label = new JLabel("test");
        this.field = new JTextField(20);

        panel.setPreferredSize(new Dimension(500, 250));
        panel.setLayout(null);

        label.setBounds(50, 75, 80, 25);
        label.setForeground(Color.WHITE);
        panel.add(label);

        field.setBounds(120, 80, 80, 20);
        panel.add(field);

        //Background Config
        try
        {
            URL url = new URL("https://watchandlearn.scholastic.com/content/dam/classroom-magazines/watchandlearn/videos/earth-and-space/earth-science-and-space/what-s-in-the-night-sky/english/wall-2018-whatsinthenightskymp4.transform/content-tile-large/image.png");
            BufferedImage image = ImageIO.read(url);
            JLabel img = new JLabel();
            img.setSize(500, 250);
            img.setIcon(new ImageIcon(image));
            img.setOpaque(false);
            panel.add(img);
        }
        catch(IOException ignored){}

        frame.setSize(500, 250);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);

        frame.setResizable(false);
        frame.setVisible(true);
    }
    public static void main(String[] args)
    {
        SampleGUI sample = new SampleGUI();
    }
}


这是我组装的GUI。我继续添加了其他Swing组件。如你所见,底部没有线条

我通过调用
SwingUtilities
invokeLater
方法启动了Swing应用程序。此方法确保在上创建和执行Swing组件

我创建了一个绘图
JPanel
,这样我就可以在
JPanel
上绘制图像。我制作了
JPanel
图像的大小。我使用了
GridBagLayout
来布置
JPanel
的组件。
GridBagLayout
将Swing组件放在列中,并将组件组居中

必须按特定顺序调用
JFrame
方法调用。这是我在Swing应用程序中使用的顺序

下面是完整的可运行代码。我将附加类设置为一个内部类,以便将此代码作为一个块发布

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class StarryNightGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new StarryNightGUI());
    }
    
    private BufferedImage image;
    
    private final BackgroundPanel backgroundPanel;
    
    public StarryNightGUI() {
        try {
            URL url = new URL("https://watchandlearn.scholastic.com/content/dam/"
                + "classroom-magazines/watchandlearn/videos/earth-and-space/"
                + "earth-science-and-space/what-s-in-the-night-sky/english/"
                + "wall-2018-whatsinthenightskymp4.transform/"
                + "content-tile-large/image.png");
            this.image = ImageIO.read(url);
        } catch (Exception e) {
            e.printStackTrace();
            this.image = null;
        }
        
         this.backgroundPanel = new BackgroundPanel();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Starry Night");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        
        frame.add(backgroundPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public class BackgroundPanel extends JPanel {
        
        private static final long serialVersionUID = 1L;

        public BackgroundPanel() {
            this.setPreferredSize(new Dimension(image.getWidth(), 
                    image.getHeight()));
            this.setLayout(new GridBagLayout());
            
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.LINE_START;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 5, 5, 5);
            
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy = 0;
            String s = "Good Morning: " + LocalDateTime.now().format(
                    DateTimeFormatter.ofPattern("d MMM yyyy  H:mm a"));
            JLabel label = new JLabel(s);
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridwidth = 1;
            gbc.gridx = 0;
            gbc.gridy++;
            label = new JLabel("Username:");
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridx++;
            JTextField field = new JTextField(10);
            add(field, gbc);
            
            gbc.gridx = 0;
            gbc.gridy++;
            label = new JLabel("Password:");
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridx++;
            JPasswordField passwordField = new JPasswordField(10);
            add(passwordField, gbc);
            
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy++;
            
            JButton button = new JButton("Login");
            add(button, gbc);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
        
    }

}

这是我组装的GUI。我继续添加了其他Swing组件。如你所见,底部没有线条

我通过调用
SwingUtilities
invokeLater
方法启动了Swing应用程序。此方法确保在上创建和执行Swing组件

我创建了一个绘图
JPanel
,这样我就可以在
JPanel
上绘制图像。我制作了
JPanel
图像的大小。我使用了
GridBagLayout
来布置
JPanel
的组件。
GridBagLayout
将Swing组件放在列中,并将组件组居中

必须按特定顺序调用
JFrame
方法调用。这是我在Swing应用程序中使用的顺序

下面是完整的可运行代码。我将附加类设置为一个内部类,以便将此代码作为一个块发布

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class StarryNightGUI implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new StarryNightGUI());
    }
    
    private BufferedImage image;
    
    private final BackgroundPanel backgroundPanel;
    
    public StarryNightGUI() {
        try {
            URL url = new URL("https://watchandlearn.scholastic.com/content/dam/"
                + "classroom-magazines/watchandlearn/videos/earth-and-space/"
                + "earth-science-and-space/what-s-in-the-night-sky/english/"
                + "wall-2018-whatsinthenightskymp4.transform/"
                + "content-tile-large/image.png");
            this.image = ImageIO.read(url);
        } catch (Exception e) {
            e.printStackTrace();
            this.image = null;
        }
        
         this.backgroundPanel = new BackgroundPanel();
    }

    @Override
    public void run() {
        JFrame frame = new JFrame("Starry Night");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        
        frame.add(backgroundPanel, BorderLayout.CENTER);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public class BackgroundPanel extends JPanel {
        
        private static final long serialVersionUID = 1L;

        public BackgroundPanel() {
            this.setPreferredSize(new Dimension(image.getWidth(), 
                    image.getHeight()));
            this.setLayout(new GridBagLayout());
            
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.anchor = GridBagConstraints.LINE_START;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.insets = new Insets(5, 5, 5, 5);
            
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy = 0;
            String s = "Good Morning: " + LocalDateTime.now().format(
                    DateTimeFormatter.ofPattern("d MMM yyyy  H:mm a"));
            JLabel label = new JLabel(s);
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridwidth = 1;
            gbc.gridx = 0;
            gbc.gridy++;
            label = new JLabel("Username:");
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridx++;
            JTextField field = new JTextField(10);
            add(field, gbc);
            
            gbc.gridx = 0;
            gbc.gridy++;
            label = new JLabel("Password:");
            label.setForeground(Color.WHITE);
            add(label, gbc);
            
            gbc.gridx++;
            JPasswordField passwordField = new JPasswordField(10);
            add(passwordField, gbc);
            
            gbc.gridwidth = 2;
            gbc.gridx = 0;
            gbc.gridy++;
            
            JButton button = new JButton("Login");
            add(button, gbc);
        }
        
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
        
    }

}

如果您只是想让代码正常工作,请替换
frame.add(面板)
frame.setContentPane(面板)并将其移动到帧组之前

    frame.setContentPane(panel);
    frame.pack();
同时删除
frame.setSize(…)
,因为pack方法将处理大小

但是,总的来说,我建议您深入了解Gilber的答案,这样您就可以了解很多关于在面板中布局元素的知识


如果您只想让代码正常工作,请替换
frame.add(面板)
frame.setContentPane(面板)并将其移动到帧组之前

    frame.setContentPane(panel);
    frame.pack();
同时删除
frame.setSize(…)
,因为pack方法将处理大小

但是,总的来说,我建议您深入了解Gilber的答案,这样您就可以了解很多关于在面板中布局元素的知识


您使用的是什么操作系统和Java版本?我刚刚创建了一个用于绘制市中心场景的模型,底部没有白色边框。请发布一篇文章,让我们看看您是如何创建JFrame和JPanel的。您是否将窗口设置为“无可调整大小”(用于?您知道吗?如果使用Hello进行诊断会更容易,我道歉。在测试了一段时间后,我发现JFrame.pack()确实删除了框架底部的白线,但是,它没有保持JPanel指定的所需尺寸,因此我无法执行SetResizeable(false),因为它大幅收缩了框架。我更新了帖子以显示代码。在执行pack()时,如何保持尺寸?感谢您的回复。@TszhimChan在执行pack()时如何维护维度?-构造函数中的最后一条语句必须是:pack(),setVisible(true)。这意味着:1)所有组件都已添加到框架中,2)setResizeable(…)语句已被调用。@TszhimChan看起来您的问题已经解决了。查看您使用的Java操作系统和版本?我刚刚创建了一个用于绘制市中心场景的模型,底部没有白色边框。请发布一篇文章,让我们看看您是如何创建JFrame和JPanel的。您是否将窗口设置为“无可调整大小”(用于?您知道吗?如果使用Hello进行诊断会更容易,我道歉。在测试了一段时间后,我发现JFrame.pack()确实删除了框架底部的白线,但是,它没有保持JPanel指定的所需尺寸,因此我无法执行SetResizeable(false),因为它大幅收缩了框架。我更新了帖子以显示代码。在执行pack()时,如何保持尺寸?感谢您的回复。@TszhimChan在执行pack()时如何维护维度?-构造函数中的最后一条语句必须是:pack(),setVisible(true)。这意味着:1)所有组件都已添加到框架中,2)setResizeable(…)语句已被调用。@TszhimChan看起来您的问题已经解决了。看见