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