无法将两个项目绘制到 Jframe
Cant draw two items to Jframe
我无法将两个项目(还会有更多)绘制到 Jframe,我正在尝试制作风景,但最后绘制的项目会覆盖之前的任何内容。
主要:
import javax.swing.*;
import java.awt.*;
public class TheComponets extends JComponent {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setTitle("A house on the water!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
House home = new House();
Sun sun = new Sun();
frame.setLayout(new GridLayout(2,3));
frame.add(home);
frame.add(sun);
}
}
房子 class:
import javax.swing.*;
import java.awt.*;
import java.applet.*;
// Program to draw a house
public class House extends JComponent
{
public void paintComponent(Graphics g)
{
// Draw the roof
g.setColor(Color.red);
int xs[] = {100,160,220};
int ys[] = {100,50,100};
Polygon poly=new Polygon(xs,ys,3);
g.fillPolygon(poly);
// Draw the body of house
g.setColor(Color.blue);
g.fillRect(100,100,120,120);
// draw the door
g.setColor(Color.orange);
g.fillRect(145,160,30,60);
}
}
太阳 class:
import javax.swing.*;
import java.awt.*;
public class Sun extends JComponent {
public void paintComponent(Graphics g)
{
// draw sun
g.setColor(Color.yellow);
g.fillOval(500, 0, 50, 50);
}
}
我想让房子和太阳出现在 Jframe 中,但现在它只会显示最后一个 frame.add() 对象。编程才两个月,对Swing和awt了解不多。请在回答时尽量记住这一点。
原因是 JFrame
默认使用 BorderLayout。当你 frame.add(component)
没有任何约束时,组件将被添加到 BorderLayout.CENTER
的位置。因此,无论您要无限制地添加多少组件,borderlayout 都会覆盖旧组件,因为所有组件都将添加到 CENTER
.
解决方案是选择要添加组件的位置:
frame.add(home,BorderLayout.CENTER);
frame.add(sun,BorderLayout.LINE_START);
要么更改容器的布局(在您的情况下为 JFrame):
frame.setLayout(new FlowLayout());
frame.add(home);
frame.add(sun);
值得一读:A Visual Guide to Layout Managers
最后,不要@Override
paint()
方法。 @Override
paintComponent()
方法。
要在 JFrame 上添加多个组件,需要从布局管理器中设置布局。它可以是 FlowLayout 或 Gridlayout 或 BorderLayout....
在你的例子中,它添加最后一个组件只是因为 JFrame 的默认布局是 BoderLayout 并且可以添加组件
frame.add(家,BorderLayout.LINE_START);
您有 PAGE_START、PAGE_END、LINE_START、LINE_END、CENTER 位置来添加组件。所以将第二个组件添加到其他位置或使用
更改框架布局
frame.setLayout(new FlowLayout());
当您使用单独的面板进行自定义绘画时,您的绘画将以 2D 形式完成,因为组件是根据所使用的布局管理器以 2D 形式定位的 space。
im trying to make a landscape,
然后将所有自定义绘画保存在一个 class 中。
首先你画背景。然后你画太阳,然后画房子等
您现在可以完全控制项目的绘制顺序。
我无法将两个项目(还会有更多)绘制到 Jframe,我正在尝试制作风景,但最后绘制的项目会覆盖之前的任何内容。
主要:
import javax.swing.*;
import java.awt.*;
public class TheComponets extends JComponent {
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(600, 600);
frame.setTitle("A house on the water!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
House home = new House();
Sun sun = new Sun();
frame.setLayout(new GridLayout(2,3));
frame.add(home);
frame.add(sun);
}
}
房子 class:
import javax.swing.*;
import java.awt.*;
import java.applet.*;
// Program to draw a house
public class House extends JComponent
{
public void paintComponent(Graphics g)
{
// Draw the roof
g.setColor(Color.red);
int xs[] = {100,160,220};
int ys[] = {100,50,100};
Polygon poly=new Polygon(xs,ys,3);
g.fillPolygon(poly);
// Draw the body of house
g.setColor(Color.blue);
g.fillRect(100,100,120,120);
// draw the door
g.setColor(Color.orange);
g.fillRect(145,160,30,60);
}
}
太阳 class:
import javax.swing.*;
import java.awt.*;
public class Sun extends JComponent {
public void paintComponent(Graphics g)
{
// draw sun
g.setColor(Color.yellow);
g.fillOval(500, 0, 50, 50);
}
}
我想让房子和太阳出现在 Jframe 中,但现在它只会显示最后一个 frame.add() 对象。编程才两个月,对Swing和awt了解不多。请在回答时尽量记住这一点。
原因是 JFrame
默认使用 BorderLayout。当你 frame.add(component)
没有任何约束时,组件将被添加到 BorderLayout.CENTER
的位置。因此,无论您要无限制地添加多少组件,borderlayout 都会覆盖旧组件,因为所有组件都将添加到 CENTER
.
解决方案是选择要添加组件的位置:
frame.add(home,BorderLayout.CENTER);
frame.add(sun,BorderLayout.LINE_START);
要么更改容器的布局(在您的情况下为 JFrame):
frame.setLayout(new FlowLayout());
frame.add(home);
frame.add(sun);
值得一读:A Visual Guide to Layout Managers
最后,不要@Override
paint()
方法。 @Override
paintComponent()
方法。
要在 JFrame 上添加多个组件,需要从布局管理器中设置布局。它可以是 FlowLayout 或 Gridlayout 或 BorderLayout....
在你的例子中,它添加最后一个组件只是因为 JFrame 的默认布局是 BoderLayout 并且可以添加组件
frame.add(家,BorderLayout.LINE_START);
您有 PAGE_START、PAGE_END、LINE_START、LINE_END、CENTER 位置来添加组件。所以将第二个组件添加到其他位置或使用
更改框架布局frame.setLayout(new FlowLayout());
当您使用单独的面板进行自定义绘画时,您的绘画将以 2D 形式完成,因为组件是根据所使用的布局管理器以 2D 形式定位的 space。
im trying to make a landscape,
然后将所有自定义绘画保存在一个 class 中。
首先你画背景。然后你画太阳,然后画房子等
您现在可以完全控制项目的绘制顺序。