1. 程式人生 > >java cs tab點擊切換標簽的實現 panel

java cs tab點擊切換標簽的實現 panel

cto err asics you package mov emp dbo blog

代碼實現效果如下

技術分享

主界面的類如下

import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;

import test.ButtonTabComponent;

public class TabComponentsDemo extends JFrame{

private JTabbedPane pane = new JTabbedPane();
private JMenuItem scrollTabItem ;
private JMenuItem componentTabItem;
private final int numTab = 5;

public TabComponentsDemo(String title) {
//設置frame標題名
super(title);
//設置關閉方式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//創建菜單欄
initMenu();
//將tabpane添加到frame中
add(pane);

}

//初始化tabpanel相關配置,並且用於resize的調用
public void runTest() {
//設置有關閉按鍵的標簽
componentTabItem.setSelected(true);

//設置標簽
for(int i = 0 ; i < numTab ; i++)
{
//標簽名
String name = "tab "+i;
//創建標簽
pane.add(name,createContent(name));
//初始化標簽上的文字和Button
initTabComponent(i);
}


//設置frame的大小
setSize(new Dimension(500,500));
//將frame放到屏幕的正中央
setLocationRelativeTo(null);
//顯示frame
setVisible(true);


}

//創建標簽內容部分
private Component createContent(String name) {
//創建一個panel,並設置布局為一個分塊
JPanel panel = new JPanel(new GridLayout(1,1));
//創建一個label
JLabel label = new JLabel(name);
//設置label的文本格式
label.setHorizontalAlignment(JLabel.CENTER);
//將label放入panel中
panel.add(label);
return panel;
}

//初始化帶有關閉按鈕的標簽頭部
private void initTabComponent(int i) {
//用這個函數可以初始化標簽的頭部
pane.setTabComponentAt(i, new ButtonTabComponent(pane));
}

//創建菜單欄
private void initMenu() {
//創建一個菜單條
JMenuBar mb = new JMenuBar();

//創建重疊tab選項
scrollTabItem = new JCheckBoxMenuItem("重疊tab");
//設置快捷鍵
scrollTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
//設置監聽事件
scrollTabItem.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent arg0) {
if(pane.getTabLayoutPolicy() == JTabbedPane.SCROLL_TAB_LAYOUT)
pane.setTabLayoutPolicy(JTabbedPane.WRAP_TAB_LAYOUT);
else
pane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
}
});

//設置可關閉的標簽的菜單
componentTabItem = new JCheckBoxMenuItem("設置可關閉的tab");
componentTabItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
componentTabItem.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
for(int i = 0 ; i < numTab ; i++)
{
if(componentTabItem.isSelected())
initTabComponent(i);
else
pane.setTabComponentAt(i, null);
}
}
});

//設置重置標簽
JMenuItem reSetItem = new JMenuItem("重置");
reSetItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R,InputEvent.CTRL_MASK));
reSetItem.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
runTest();
}
});

//創建菜單
JMenu menu = new JMenu("選項");
//添加菜單項
menu.add(componentTabItem);
menu.add(scrollTabItem);
menu.add(reSetItem);

//添加菜單
mb.add(menu);
//添加菜單條(註意一個frame只能有一個菜單條,所以用set)
setJMenuBar(mb);

}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
new TabComponentsDemo("可關閉的tab測試").runTest();
}
});
}


}

會用到的另一個類如下:

package test;


import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.plaf.basic.BasicButtonUI;

public class ButtonTabComponent extends JPanel{
private final JTabbedPane pane;

public ButtonTabComponent(final JTabbedPane pane) {
//設置標簽頭要水平的,從左向右的排列組件,並且組件的間距為0(橫向和縱向)
super(new FlowLayout(FlowLayout.LEFT, 0, 0));

if(pane == null)
throw new NullPointerException("pane can not be null");
this.pane = pane;

//不畫出panel的邊界
setOpaque(false);

//創建標簽頭的文字內容
JLabel label = new JLabel(){
//重寫方法,返回pane指定位置的名字,這裏有點繞,可以好好理解理解
//為什麽不直接設置標簽的內容,而是通過重寫函數來修改標簽內容
//可能是希望業務邏輯盡量不要散落在外部
@Override
public String getText() {
//可以獲得當前panel在tab中的位置
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if(i != -1)
//得到當前panel的名字(實際是tab的名字)
return pane.getTitleAt(i);
return null;
}
};

label.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
add(label);
//創建關閉按鈕(就是那個差按鍵)
JButton button = new TabButton();
add(button);
setBorder(BorderFactory.createEmptyBorder(2,0,0,0));
}

private class TabButton extends JButton implements ActionListener{
public TabButton() {
//設置按鍵的大小
final int size = 17;
setPreferredSize(new Dimension(size,size));
//設置按鍵的提示信息
setToolTipText("關閉窗口");
//設置按鍵的繪制於普通按鍵相同
setUI(new BasicButtonUI());
//不對Button進行填充,就是按鍵是透明的
setContentAreaFilled(false);
//按鍵不能獲得焦點
setFocusable(false);
//設置按鍵的邊框為雕刻樣式
setBorder(BorderFactory.createEtchedBorder());
//系統不自動繪制按鍵邊界(這個邊界在鼠標放上去之後才繪制)
setBorderPainted(false);

//添加按鍵點擊事件
addActionListener(TabButton.this);
//添加鼠標事件(主要是mouseover 和 mouse exit)
addMouseListener(mouseListener);

}

//重寫Button的繪制函數
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

//創建一個graphics2D,因為需要在Button上畫差
Graphics2D g2 = (Graphics2D) g.create();

//設置畫筆,寬度為2
g2.setStroke(new BasicStroke(2));
//設置畫筆顏色
g2.setColor(Color.BLACK);
//當鼠標移動到Button上時,畫筆為紫色
if(getModel().isRollover())
g2.setColor(Color.PINK);
//繪制差
int delta = 6;
g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
//釋放畫筆資源
g2.dispose();
}

@Override
public void actionPerformed(ActionEvent arg0) {
//當按鍵被點擊,關閉當前標簽頁
int i = pane.indexOfTabComponent(ButtonTabComponent.this);
if(i != -1)
pane.remove(i);
}

private final MouseListener mouseListener = new MouseAdapter() {
@Override
public void mouseEntered(MouseEvent event) {
//鼠標移入按鍵,繪制按鍵邊界
Component c = event.getComponent();
if(c instanceof AbstractButton)
((AbstractButton)c).setBorderPainted(true);
}

@Override
public void mouseExited(MouseEvent event) {
//鼠標移出按鍵,不繪制按鍵邊界
Component c = event.getComponent();
if(c instanceof AbstractButton)
((AbstractButton)c).setBorderPainted(false);
}

};

}

}

java cs tab點擊切換標簽的實現 panel