JFrame的边框布局定位不如预期

时间:2014-09-14 16:43:04

标签: java swing jframe awt layout-manager

我试图创建一个执行此操作的Java程序,

的框架

NORTH ;说明:双按钮监听器

CENTER :说明:点击Button1更改纯色圆圈,点击Button2更改渐变圈

SOUTH :我想要2个按钮,按钮1和按钮2

WEST :渐变色圆圈

EAST :纯色圆圈

相当简单,当我点击按钮时,相应的圆圈的颜色应该改变

代码如下..

import javax.swing.*;//for the frame etc
import java.awt.*;//for  paintComponent(),Grapics Object etc
import java.awt.event.*;//for listeners


class CircleGradientColor extends JPanel
{
    public void paintComponent(Graphics g)
    {

    Graphics2D g2d=(Graphics2D)g;//cast 
    int r1=(int)(Math.random()*255);
    int g1=(int)(Math.random()*255);
    int b1=(int)(Math.random()*255);

    int r2=(int)(Math.random()*255);
    int g2=(int)(Math.random()*255);
    int b2=(int)(Math.random()*255);
    Color startcolor=new Color(r1,g1,b1);
    Color endcolor=new Color(r2,g2,b2);
    GradientPaint gradient=new GradientPaint(10,10,startcolor,70,70,endcolor);
    g2d.setPaint(gradient);//here it aint set color for a Graphics2D object
    g2d.fillOval(10,10,60,60);//fills with the Current PaintBrushColor
    }

}

class CircleSolidColor extends JPanel//this class will contain code for the circle
{

    public void paintComponent(Graphics g)
    {
    int r=(int)(Math.random()*255);//generate random float between 0 & 255
    int b=(int)(Math.random()*255);//generate random float between 0 & 255
    int gr=(int)(Math.random()*255);//generate random float between 0 & 255
    Color randcolor=new Color(r,gr,b);//name clashed with Graphics g
    g.setColor(randcolor);
    g.fillOval(10,10,60,60);
    }
}

public class TwoButtonGui 
{
JFrame frame;
CircleSolidColor circlesolidcolor;
CircleGradientColor circlegradientcolor;
JButton b1;
JButton b2;
JLabel toplabel;
JLabel centerlabel;

    public static void main(String[] args)
    {
    TwoButtonGui twobuttongui=new TwoButtonGui();
    twobuttongui.go();
    }

public void go()
{
frame=new JFrame();

toplabel=new JLabel("Example of Multiple Action Listeners");
centerlabel=new JLabel("Click The respective Button to change circle Color");
b1=new JButton("Click to change solid");
b2=new JButton("Click to change Gradient");
b1.addActionListener(new CircleSolidColorListener());
b2.addActionListener(new CircleGradientColorListener());

circlesolidcolor=new CircleSolidColor();
circlegradientcolor=new CircleGradientColor();
frame.setSize(1000,1000);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(BorderLayout.NORTH,toplabel);
frame.getContentPane().add(BorderLayout.SOUTH,b1);
frame.getContentPane().add(BorderLayout.SOUTH,b2);

//if i add 2 SOUTH position i though first will go left and second right 
//IS it so
frame.getContentPane().add(BorderLayout.CENTER,centerlabel);
frame.getContentPane().add(BorderLayout.WEST,circlesolidcolor);
frame.getContentPane().add(BorderLayout.EAST,circlegradientcolor);
frame.setVisible(true);

}
//inner class for solidlistener
class CircleSolidColorListener implements ActionListener
{
    public void actionPerformed(ActionEvent e1)
    {
    circlesolidcolor.repaint();
    }
}


class CircleGradientColorListener implements ActionListener
{
    public  void actionPerformed(ActionEvent e2)
    {
    circlegradientcolor.repaint();
    }
}

}//main class ends

但我得到的输出相当荒谬

Screen Shot of the Swing Program Output

我在哪里错了,我知道可以使用多个Panels和LayoutMangaers等来纠正它,但有没有办法得到我描述的结果而没有那么多? 我把程序编写为 Headfirst Java 中的一个示例的变体,它似乎可以正常工作(2个按钮,一个标签和一个圆圈),所以为什么没有&#39 ;这项工作,我可以在一个位置添加2个组件,如我的评论中描述的BorderLayout.SOUTH, 谢谢!

1 个答案:

答案 0 :(得分:1)

北,是对的。

南方,添加b2将覆盖b1,您要做的是创建一个新的容器,如JPanel,并将b1添加到该容器的b2。然后将此容器添加到南方。这个新容器可以使用GridLayout(1,2)

中心,是对的。

东部和西部,组件是空白的'所以布局管理器给出的默认大小为none(在容器背景中绘制!= isNotBlank())。但是,您可以使用圆* .setPrefferredSize(维度)来强制它们的大小。