yscyfy 2012-05-20 08:20
浏览 734
已采纳

java Swing JPanel 怎么修改默认布局

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

public class test_shu extends JPanel{
    private JPanel center = new JPanel(new FlowLayout());
    private testPanel[] t = new testPanel[5];
    
    public test_shu() {
        init();
        this.setPreferredSize(new Dimension(210, 500));
        this.setLayout(new BorderLayout());
        this.add(center,BorderLayout.CENTER);
    }
    private void init() {   
        for(int i=0;i<5;i++){
            t[i] = new testPanel();             
            center.add(t[i]);
        }
    }
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setSize(210, 500);    
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new test_shu());
        f.setLocation(500, 80);
        f.pack();
        f.setVisible(true);     
        
    }
    
}


class testPanel extends JPanel{ 
    
    public testPanel() {        
        this.setBorder(BorderFactory.createLineBorder(Color.red));
        this.setSize(200, 30);
        this.setPreferredSize(new Dimension(200, 30));
        this.setMaximumSize(new Dimension(200, 30));            
    }
    
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLUE);        
        g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
    }
    
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 30);
    }
}

 上面的代码显示5个testPanel类型的JPanel,结果如下,可是这5个JPnael之间都有空隙,而我的代码中并没有设置这些空隙,这是什么原因?怎么让它消失?小弟刚学还不太明白

 

  • 写回答

1条回答 默认 最新

  • 晓星 2012-05-20 12:53
    关注

    1.布局首先要理清思路,那一个组件放在哪个组件里面,就如你的代码他们分别是 JFrame f中放置了JPanel center,而JPanel center中又放置了5个testPanel[] t = new testPanel[5];
    也就是说,你的5个test_shu对象的位置由center容器的布局方式决定即你的代码22行处 private JPanel center = new JPanel(new FlowLayout());

    这个布局方式决定,所以,而FlowLayout的布局方式的默认值是:

    流式布局管理器把容器看成一个行集,好象平时在一张纸上写字一样,一行写满就换下一行。行高是用一行中的控件高度决定的。FlowLayout是所有 JApplet/JApplet的默认布局。在生成流式布局时能够指定显示的对齐方式,默认情况下是居中(FlowLayout.CENTER)

    FlowLayout() //生成一个默认的流式布局,组件在容器里居中,每个组件之间留下5个像素的距离.
    FlowLayout(int alinment) //可以设定每行组件的对齐方式.
    FlowLayout(int alignment,int horz,int vert) //设定对齐方式并设定组件水平和垂直的距离.
    当容器的大小发生变化时,用FlowLayout管理的组件会发生变化,其变化规律是:组件的大小不变,但是相对位置会发生变化.

    所以要达到你的效果,只需要将
    22行处的代码改成如下设置就可以了:

    [color=red]private JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));[/color]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路