在下面的代码中,我创建了JFrame
,将尺寸设置为800 x 800像素,将布局设置为BorderLayout
,然后添加JPanel
。
在JPanel
中,我使用paintComponent
在7个位置绘制20x20像素的图像。
在0-0位置,图标出现在右上角。
图标高20像素,框架和面板均为800像素高,因此在x-780处绘制图标时,应将图标与窗口底部对齐。但是icond甚至没有出现。
其余图标绘制为x-770,x-760,x-758和x-750。 x-758看起来与窗口底部对齐。因此,我得出结论JPanel
上的{[0]}从JFrame
的x [42]
我认为我已正确设置了BorderLayout
。我会在setSize()
的构造函数中调用JPanel
。我认为设置一个明确的大小可能搞砸了。但在评论该线后,该程序显示相同的行为。
你能告诉我我做错了吗?
Frametest.java
package frametest;
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class FrameTest extends JFrame{
public static final int HEIGHT = 800;
public static final int WIDTH = 800;
public FrameTest(){
setLayout(new BorderLayout());
add(new Panel(WIDTH, HEIGHT), BorderLayout.CENTER);
pack();
setTitle("Frame Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(WIDTH, HEIGHT);
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new FrameTest();
}
}
Panel.java
package frametest;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Panel extends JPanel{
private int height;
private int width;
Image icon1 = new ImageIcon(this.getClass().getResource("icon1.png")).getImage(); //Note that the png file is 20 x 20 pixels.
public Panel(int width, int hieght){
setBackground(Color.BLUE);
//setSize(width, hieght);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(icon1, 0, 0, this); //appears in the upper-right corner
g2d.drawImage(icon1, 20, 780, this); //does not appear
g2d.drawImage(icon1, 40, 770, this); //appears with bottom pixels cut off
g2d.drawImage(icon1, 70, 760, this); //appears with the bottom pixels cut off
g2d.drawImage(icon1, 100, 758, this); //appears aligned with bottom of the window
g2d.drawImage(icon1, 130, 750, this); //appears slightly above the bottom of the window
g2d.drawImage(icon1, 780, 20, this); //appears aligned with the right side of the screen.
}
}
答案 0 :(得分:1)
根据组件的首选尺寸,使用frame.pack()
(正如您已使用的那样)代替符合组件的frame.setSize()
。只需删除setSize()
来电。
在自定义绘画的情况下,覆盖getPreferredSize()
以设置JPanel
的首选大小。
示例代码:
class Panel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
...
}
@Override
public Dimension getPreferredSize() {
return new Dimension(..., ...);
}
}
答案 1 :(得分:1)
听起来问题是因为JFrame周围的边框。像顶部菜单栏这样的东西会从可用空间中占用一些空间来显示JFrame中的内容。
尝试将getPreferredSize()
添加到您的JPanel,并在您的JFrame上调用pack()
。
答案 2 :(得分:1)
您正在设置JFrame
的大小。这包括框架装饰,菜单栏(如果有的话),等等。如果您希望您的JPanel具有尺寸800 x 800
,请设置JPanel的首选尺寸并使用JFrame.pack()
。
为此,请从Frametest.java
中删除以下行:
setSize(WIDTH, HEIGHT);
然后,在Panel.java
中,从
//setSize(width, hieght);
为:
setPreferredSize(new Dimension(800, 800));
除此之外,您还可以覆盖getPreferredSize()
:
public Dimension getPreferredSize ()
{
return new Dimension(800, 800);
}