【Java Swing探索之路系列】之二:Java Swing布局面板组件

作者:郭嘉
邮箱:allenwells@163.com
博客:http://blog.csdn.net/allenwells
github:https://github.com/AllenWell

面板指的是容器,即中间容器类,可以将基本组件放置在其中,组成丰富多彩的用户界面。

一 JPanel

在JPanel的使用中,有一个双缓冲的概念,这个技术旨在改进频繁变化的组件显示效果。可以在JPanel初始化的时候进行定义如下所示:

举例

展示如何使用JPanel中间容器类。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JPanelDemo
{
    //WIDTH是指整个顶层框架的宽度。
    //HEIGHT是指整个顶层框架的长度。
    static final int WIDTH=300;
    static final int HEIGHT=150;
    public static void main(String[] args)
    {
        JFrame jf=new JFrame("测试程序");
        jf.setLayout(new BorderLayout());
        jf.setSize(WIDTH,HEIGHT);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        JPanel contentPane=new JPanel();//创建六个中间容器,并且将contentPane放到顶层容器内
        JPanel p1=new JPanel();
        JPanel p2=new JPanel();
        JPanel p3=new JPanel();
        JPanel p4=new JPanel();
        JPanel p5=new JPanel();
        jf.setContentPane(contentPane);
        JButton b1=new JButton("小赵");//创建九个普通按钮组件,将p1到p5五个面板设置为流布局。
        JButton b2=new JButton("小李");
        JButton b3=new JButton("小王");
        JButton b4=new JButton("小孙");
        JButton b5=new JButton("小钱");
        JButton b6=new JButton("小周");
        JButton b7=new JButton("小政");
        JButton b8=new JButton("小武");
        JButton b9=new JButton("姓");
        p1.setLayout(new FlowLayout());
        p2.setLayout(new FlowLayout());
        p3.setLayout(new FlowLayout());
        p4.setLayout(new FlowLayout());
        p5.setLayout(new FlowLayout());
        p1.add(b1); //将b1、b2加到p1中,将b3、b4加到p2中,将b5、b6加到p3中,将b7、b8加到p4中,将b9加到p5中
        p1.add(b2);
        p2.add(b3);
        p2.add(b4);
        p3.add(b5);
        p3.add(b6);
        p4.add(b7);
        p4.add(b8);
        p5.add(b9);
        contentPane.add(p1,"North");//将p1到p5五个面板按照BorderLayout布局方式放置到contentPane面板中
        contentPane.add(p2,"South");
        contentPane.add(p3,"East");
        contentPane.add(p4,"West");
        contentPane.add(p5,"Center");
}
}

运行效果如下所示:

这里写图片描述

二 JScrollPane

JScrollPane是一个带滚动条的容器类,它可以用来显示一些文本、表格内容,当内容超过JScrollPane面板大小时,JScrollPane会自动添加滚动条。

可以通过滚动策略来控制滚动条的显示,如下所示:

确定重直

  • ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED 需要时出现垂直滚动条

  • ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER 从不出现垂直滚动条

  • ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS 总是出现垂直滚动条

确定水平

  • ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED 需要时出现水平滚动条

  • ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER 从不出现水平滚动条

  • ScrollPaneConstants.HORIZONTA_SCROLLBAR_ALWAYS 总是出现水平滚动条

举例

展示自动水平和垂直方向都会出现滚动条。

import javax.swing.*;
public class JScrollPaneDemo
{
    static final int WIDTH=300;
    static final int HEIGHT=150;
    public static void main(String[] args)
    {
        JFrame jf=new JFrame("测试程序");
        jf.setSize(WIDTH,HEIGHT);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        JTextArea ta=new JTextArea("我们是某某软件公司的骨干开发人员,我们会竭诚为您服务!!!");//创建一个文本域组件和一个滚动条面板,并且将滚动条面板添加到顶层容器内
        JScrollPane sp=new JScrollPane(ta,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS ,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS  );
        jf.setContentPane(sp);
  }
 }

运行效果如下所示:

这里写图片描述

三 JSplitPane

举例

将顶层窗口分成两个部分,每一个部分添加一个带流布局的内容面板,再在内容面板中添加普通按钮组件。

import javax.swing.*;
import java.awt.*;
public class JSplitPaneDemo
{
 public static void main (String[] args)
 {
///创建四个普通按钮组件
  JButton b1=new JButton ("确定");
  JButton b2=new JButton ("取消");
  JButton b3=new JButton("优秀");
  JButton b4=new JButton("良好");
///创建两个中间容器,并且被设置为流布局的布局方式
  JPanel p1=new JPanel();
  JPanel p2=new JPanel();
  p1.setLayout(new FlowLayout());
  p2.setLayout(new FlowLayout());
///将b1和b2放到p1中,将b3和b4放到p2中。
  p1.add(b1);
  p1.add(b2);
  p2.add(b3);
  p2.add(b4);
  JSplitPane splitPane = new JSplitPane ();
  splitPane.setOneTouchExpandable (true);
  splitPane.setContinuousLayout (true);
  splitPane.setPreferredSize (new Dimension (50,100));
  splitPane.setOrientation (JSplitPane.HORIZONTAL_SPLIT);
splitPane.setLeftComponent (p1);
  splitPane.setRightComponent (p2);
  splitPane.setDividerSize (3);
  splitPane.setDividerLocation(50);
  JFrame frame = new JFrame ("测试窗口");
  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
  frame.setVisible (true);
  frame.setContentPane (splitPane);
  frame.pack ();
 }
}

运行效果如下所示:

这里写图片描述

四 JTabbedPane

举例

创建选项卡面板,并在每个标签选项卡中添加基本组件。

import javax.swing.*;
import java.awt.*;
public class JTabbedPaneDemo
{
 public static void main(String[] args)
 {
  try
{//显示外观风格
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e){} 
JFrame frame = new JFrame ("资金状况");
  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
  frame.setVisible (true);//默认为false
  JTabbedPane tp=new JTabbedPane();//创建一个选项卡容器,将之添加到顶层容器内
  frame.setContentPane(tp);
  JPanel panel1 = new JPanel ();
  JPanel panel2 = new JPanel ();
  JPanel panel3 = new JPanel ();
  JPanel panel4 = new JPanel ();
  JPanel panel5 = new JPanel ();
  tp.addTab("panel1", panel1); //添加选项卡容器,并且设置其中每个选项卡的标签以及其是否可启用
  tp.setEnabledAt(0,true);
  tp.setTitleAt(0,"个人收入状况");
  tp.addTab ("panel2", panel2);
  tp.setEnabledAt (1, true);
  tp.setTitleAt (1,"工资");
  tp.addTab ("panel3", panel3);
  tp.setEnabledAt (2, true);
  tp.setTitleAt (2,"奖金");
  tp.addTab ("panel4", panel4);
  tp.setEnabledAt(0,true);
  tp.setTitleAt(3,"津贴");
  tp.addTab ("panel5", panel5);
  tp.setEnabledAt(4,true);
  tp.setTitleAt(4,"社保");
///设置其大小以及其选项卡的位置方向
  tp.setPreferredSize (new Dimension (500,200));
  tp.setTabPlacement (JTabbedPane.TOP);
///设置选项卡在容器内的显示形式
  tp.setTabLayoutPolicy (JTabbedPane.SCROLL_TAB_LAYOUT);
  frame.pack();

//创建八个标签组件,将五个中间容器设置为流布局,并且将标签组件分别放入到其中
  JLabel l1=new JLabel("工资状况");
  JLabel l2=new JLabel("3000元/月");
  JLabel l3=new JLabel("奖金状况");
  JLabel l4=new JLabel("1500元/月");
  JLabel l5=new JLabel("津贴状况");
  JLabel l6=new JLabel("500元/月");
  JLabel l7=new JLabel("社保状况");
  JLabel l8=new JLabel("200元/月");
  panel2.setLayout(new FlowLayout());
  panel3.setLayout(new FlowLayout());
  panel4.setLayout(new FlowLayout());
  panel5.setLayout(new FlowLayout());
  panel2.add(l1);
  panel2.add(l2);
  panel3.add(l3);
  panel3.add(l4);
  panel4.add(l5);
  panel4.add(l6);
  panel5.add(l7);
  panel5.add(l8);
  frame.pack();
 }
}

运行效果如下所示:

这里写图片描述

五 JInternalFrame

举例

创建两个JInternalFrame窗口,将这两个JInternalFrame窗口放到一个顶层容器的内容面板中。

import javax.swing.*;
import java.awt.*;
public class JInternalFrameDemo
{
    static final int WIDTH=300;
    static final int HEIGHT=150;
    public static void main(String[] args)
    {
       JFrame jf=new JFrame("测试程序");
        jf.setSize(WIDTH,HEIGHT);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        JPanel contentPane=new JPanel();//创建一个中间容器,并且将之添加到顶层容器内,将之设置为流布局。
        jf.setContentPane(contentPane);
        contentPane.setLayout(new FlowLayout());
        JDesktopPane dp=new JDesktopPane();//创建一个虚拟桌面容器,将dp添加到以上创建的中间容器中
        dp.setLayout(new FlowLayout());
        contentPane.add(dp);
        JInternalFrame jif=new JInternalFrame("第一个窗口",true,true,true); //创建两个JIntenaFrame容器,并且创建六个标签组件,分别将它们添加到两个JInternaFrame容器内
        JInternalFrame jif1=new JInternalFrame("第二个窗口",true,true,true);
        JLabel l1=new JLabel("这是我第一个窗口");
        JLabel l2=new JLabel("这也是你第一个窗口");
        JLabel l3=new JLabel("这同时是他第一个窗口");
        JLabel l4=new JLabel("这是我第二个窗口");
        JLabel l5=new JLabel("这也是你第二个窗口");
        JLabel l6=new JLabel("这同时是他第二个窗口");
        jif.setLayout(new FlowLayout());
        jif1.setLayout(new FlowLayout());
        jif.add(l1);
        jif.add(l2);
        jif.add(l3);
        jif1.add(l4);
        jif1.add(l5);
        jif1.add(l6);
        dp.add(jif);
        dp.add(jif1);
        jif.setVisible(true);
        jif1.setVisible(true);
       }
}

运行效果如下所示:

这里写图片描述

六 JLayeredPane

举例

将两个普通按钮组件,放置到JLayeredPane容器中,再为这两个按钮组件分成两个不同的层次,这样的话,就当单击下面一个层的按钮组件,它就会被显示到上面一个层上来。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class JLayeredPaneDemo extends JFrame implements ActionListener 
{
    private static final long serialVersionUID = 1L;
    static final int WIDTH=300;
    static final int HEIGHT=150;
    JLayeredPane lp=new JLayeredPane();
    static JButton b1=new JButton("确定");
    static JButton b2=new JButton("取消");
    public test10() 
{
///设置顶层容器的标题
      super("测试窗口");
      ///将新建的JLayeredPane放到顶层容器内
      super.setContentPane(lp);
      b1.addActionListener(this); // 按钮事件
      b2.addActionListener(this);

      lp.add(b1, new Integer(200));
      lp.add(b2, new Integer(300));
      b1.setBounds(new Rectangle(100, 100, 100, 100));
      b1.setVisible(true);
      b2.setBounds(new Rectangle(50, 50, 100, 100));
      b2.setVisible(true);
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setSize(360, 260);
      this.setVisible(true);
 }
 public void actionPerformed(ActionEvent e) 
 {
  if (e.getActionCommand().equals("确定")) 
  { // 判断是哪个按钮的动作
   lp.setLayer(b1, 300); // 重新设置组件层数
   lp.setLayer(b2, 200);
  } 
  else if (e.getActionCommand().equals("取消"))
  {
   lp.setLayer(b1, 200);
   lp.setLayer(b2, 300);
  }
 }
 public static void main(String args[]) {
  new JLayeredPaneDemo();
 }
}

运行效果如下所示:

这里写图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以通过在JPanel中重写paintComponent方法来实现在不影响布局组件的情况下添加背景图片。具体步骤如下: 1. 创建一个自定义的JPanel类,并且重写其paintComponent方法。 2. 在paintComponent方法中,首先调用父类的paintComponent方法绘制原来的组件。 3. 然后通过Graphics对象绘制背景图片,可以使用ImageIO读取图片文件,也可以使用getToolkit().getImage()方法获取图片。 4. 最后将该自定义JPanel设置为容器的内容面板,即可实现在不影响布局组件的情况下添加背景图片。下面是一个简单的示例代码: ```java import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.io.File; import java.io.IOException; public class BackgroundPanel extends JPanel { private Image backgroundImage; private JLabel label; public BackgroundPanel() { setLayout(new BorderLayout()); try { backgroundImage = ImageIO.read(new File("background.jpg")); } catch (IOException e) { e.printStackTrace(); } label = new JLabel("Hello, World!"); label.setFont(new Font("Arial", Font.BOLD, 24)); label.setHorizontalAlignment(SwingConstants.CENTER); add(label); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this); } public static void main(String[] args) { JFrame frame = new JFrame("Background Panel Example"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); BackgroundPanel panel = new BackgroundPanel(); frame.setContentPane(panel); frame.setVisible(true); } } ``` 在这个示例中,我们创建了一个BackgroundPanel类,它继承自JPanel,并且重写了paintComponent方法。在paintComponent方法中,首先调用了父类的方法,然后绘制了背景图片。在构造函数中,我们添加了一个JLabel组件用于显示文字,并将该组件添加到了容器中。最后,在main方法中,我们创建了一个JFrame窗口,设置其大小和关闭操作,并将BackgroundPanel设置为容器的内容面板。运行程序,可以看到窗口中的背景图片和文字。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值