Java JFrame底部的白色边缘
我正在使用javaxswing,无法摆脱JFrame底部的这个小小的白色边框。我的JFrame的结构方式是,我向JPanel添加了一组组件(例如按钮、文本字段、标签),然后将它们添加到框架中。我尝试将面板的首选大小设置为所需的尺寸,然后在JFrame上调用pack(),但没有效果。先谢谢你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
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看起来您的问题已经解决了。看见