为什么下面的代码只适用于 GridLayout?
Why does the following code only work with GridLayout?
当我添加 BorderLayout
或 FlowLayout
时,我无法在 Canvas
上绘制任何类型的图形。虽然它与 GridLayout
一起工作正常,但界面不太好。
即使我尝试 setBounds
我得到的结果与边框和流布局相同。谁能给我一些关于这个问题的建议?
//Why does the following code not work with FlowLayout??
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Mycanvas1 extends Canvas
{
int flag=0;
public void paint(Graphics g)
{
if(flag==1)
{
g.setColor(Color.pink);
g.drawRoundRect(30,30,100,100,20,20);
g.setColor(Color.blue);
g.drawString("Anks",67,75);
g.drawOval(100,130,15,15);
g.drawOval(50,130,15,15);
}
}
}
class Myf2 implements ActionListener
{
Mycanvas1 m=new Mycanvas1();
Myf2()
{
JFrame f=new JFrame("Graphics");
Button b=new Button("Line");
//b.setBounds(400,400,41,41);
b.addActionListener(this);
f.add(m);
f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,400);
f.setLayout(new GridLayout());
f.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
m.flag=1;
m.repaint();
}
public static void main(String... s)
{
new Myf2();
}
}
class Mycanvas1 extends Canvas
AFAIR a Canvas
的默认大小为 0x0 像素。 @Override
getPreferredSize()
方法到 return 一个合理的值, 可能 被布局尊重。
这就是我的意思,使用 FlowLayout
。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Mycanvas1 extends Canvas {
int flag = 0;
Mycanvas1() {
// so we can easily see its bounds
setBackground(Color.WHITE);
}
public void paint(Graphics g) {
super.paint(g); // honor the paint chain..
if (flag == 1) {
g.setColor(Color.pink);
g.drawRoundRect(30, 30, 100, 100, 20, 20);
g.setColor(Color.blue);
g.drawString("Anks", 67, 75);
g.drawOval(100, 130, 15, 15);
g.drawOval(50, 130, 15, 15);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150,150);
}
}
class Myf2 implements ActionListener {
Mycanvas1 m = new Mycanvas1();
Myf2() {
JFrame f = new JFrame("Graphics");
// best done before adding components
f.setLayout(new FlowLayout());
Button b = new Button("Line");
b.addActionListener(this);
f.add(m);
f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//f.setSize(400, 400); // no, don't guess, instead..
f.pack();
f.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
m.flag = 1;
m.repaint();
}
public static void main(String... s) {
new Myf2();
}
}
如果您不让 Canvas
具有大小,那么这可能会导致问题,具体取决于 Layout
。
FlowLayout
不会调整其子组件的大小,它只是让它们确定自己的大小(Canvas
默认为 0,0)并将它们放在 space 的 Container
从左到右然后从上到下。
BorderLayout
resize the subcomponents but you need to use the BorderLayout
constraints: NORTH
, etc. 默认约束是 CENTER
但是加两个是错误的BorderLayout
逻辑中的组件 space.
GridLayout
调整其组件的大小,使每个组件具有相同的大小(矩形),它们被放置在逻辑网格中,等等。逻辑网格填充所有 space 的 Container
主机。
因此,向您的组件添加一个 Dimension getPreferredSize()
方法,使 returns 内部绘图的 "natural" 大小。这将使您的组件表现得更正常。
当我添加 BorderLayout
或 FlowLayout
时,我无法在 Canvas
上绘制任何类型的图形。虽然它与 GridLayout
一起工作正常,但界面不太好。
即使我尝试 setBounds
我得到的结果与边框和流布局相同。谁能给我一些关于这个问题的建议?
//Why does the following code not work with FlowLayout??
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Mycanvas1 extends Canvas
{
int flag=0;
public void paint(Graphics g)
{
if(flag==1)
{
g.setColor(Color.pink);
g.drawRoundRect(30,30,100,100,20,20);
g.setColor(Color.blue);
g.drawString("Anks",67,75);
g.drawOval(100,130,15,15);
g.drawOval(50,130,15,15);
}
}
}
class Myf2 implements ActionListener
{
Mycanvas1 m=new Mycanvas1();
Myf2()
{
JFrame f=new JFrame("Graphics");
Button b=new Button("Line");
//b.setBounds(400,400,41,41);
b.addActionListener(this);
f.add(m);
f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(400,400);
f.setLayout(new GridLayout());
f.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
m.flag=1;
m.repaint();
}
public static void main(String... s)
{
new Myf2();
}
}
class Mycanvas1 extends Canvas
AFAIR a Canvas
的默认大小为 0x0 像素。 @Override
getPreferredSize()
方法到 return 一个合理的值, 可能 被布局尊重。
这就是我的意思,使用 FlowLayout
。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Mycanvas1 extends Canvas {
int flag = 0;
Mycanvas1() {
// so we can easily see its bounds
setBackground(Color.WHITE);
}
public void paint(Graphics g) {
super.paint(g); // honor the paint chain..
if (flag == 1) {
g.setColor(Color.pink);
g.drawRoundRect(30, 30, 100, 100, 20, 20);
g.setColor(Color.blue);
g.drawString("Anks", 67, 75);
g.drawOval(100, 130, 15, 15);
g.drawOval(50, 130, 15, 15);
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(150,150);
}
}
class Myf2 implements ActionListener {
Mycanvas1 m = new Mycanvas1();
Myf2() {
JFrame f = new JFrame("Graphics");
// best done before adding components
f.setLayout(new FlowLayout());
Button b = new Button("Line");
b.addActionListener(this);
f.add(m);
f.add(b);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//f.setSize(400, 400); // no, don't guess, instead..
f.pack();
f.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
m.flag = 1;
m.repaint();
}
public static void main(String... s) {
new Myf2();
}
}
如果您不让 Canvas
具有大小,那么这可能会导致问题,具体取决于 Layout
。
FlowLayout
不会调整其子组件的大小,它只是让它们确定自己的大小(Canvas
默认为 0,0)并将它们放在 space 的 Container
从左到右然后从上到下。
BorderLayout
resize the subcomponents but you need to use the BorderLayout
constraints: NORTH
, etc. 默认约束是 CENTER
但是加两个是错误的BorderLayout
逻辑中的组件 space.
GridLayout
调整其组件的大小,使每个组件具有相同的大小(矩形),它们被放置在逻辑网格中,等等。逻辑网格填充所有 space 的 Container
主机。
因此,向您的组件添加一个 Dimension getPreferredSize()
方法,使 returns 内部绘图的 "natural" 大小。这将使您的组件表现得更正常。