效果圖
思路:
JTabbedPane ?提供了壹個setUI方法,來修改JTabbedPane 的界面和外觀
然後我們可以繼承BasicTabbedPaneUI 重寫裏面的部分繪制方法來修改外觀
參考代碼
import?java.awt.*;import?java.awt.event.*;
import?javax.swing.*;
import?javax.swing.plaf.ComponentUI;
import?javax.swing.plaf.basic.BasicTabbedPaneUI;
public?class?SwingDemo?extends?JFrame?implements?ActionListener?{
JButton?jb;
JPanel?jp3;
public?SwingDemo()?{
JTabbedPane?jtpTotal?=?new?JTabbedPane();//橫向的JTabbedPane?,模塊壹,模塊二...
JTabbedPane?jtpa?=?new?JTabbedPane();//模塊壹,對應的是jtpa
jtpa.setTabPlacement(JTabbedPane.LEFT);//設置標簽在縱向
JPanel?jp1?=?new?JPanel(new?BorderLayout());//新建壹個JPanel,布局為邊界布局
JTextArea?jta?=?new?JTextArea();//文本域
jta.append("人生若只如初見,何事秋風悲畫扇.");//文本域的內容
jta.setFont(new?Font("宋體",Font.BOLD,?25));//文本域的文字
jp1.add(jta);
JPanel?jp2?=?new?JPanel();
JLabel?jl?=?new?JLabel("PI=3.1415926");
jl.setFont(new?Font("隸書",Font.BOLD,?20));
jl.setForeground(Color.RED);//設置jl的文字顏色
jp2.add(jl);
//為了方便響應事件,把jb,和jp3的定義放到了頂上
jp3?=?new?JPanel();
jb?=?new?JButton("點擊按鈕修改本頁的背景色");
jb.addActionListener(this);//添加事件響應
jp3.add(jb);
jtpa.add("選項壹",?jp1);
jtpa.add("選項二",?jp2);
jtpa.add("選項三",?jp3);
JPanel?jpA?=?new?JPanel(new?BorderLayout());
jpA.add(jtpa);
//把jtpa的所有選項的標簽的背景色設置為白色
for?(int?i?=?0;?i?<?jtpa.getTabCount();?i++)?{
jtpa.setBackgroundAt(i,?Color.WHITE);
}
jtpa.setUI(new?TPUI());
jtpTotal.add("模塊壹",?jpA);
//下面的jtpb和jtpc沒有添加組件,也沒有設置顏色,?但是結構看起來比較直觀
JTabbedPane?jtpb?=?new?JTabbedPane();
jtpb.setTabPlacement(JTabbedPane.LEFT);
JPanel?jp4?=?new?JPanel();
JPanel?jp5?=?new?JPanel();
JPanel?jp6?=?new?JPanel();
jtpb.add("選項四",?jp4);
jtpb.add("選項五",?jp5);
jtpb.add("選項六",?jp6);
JPanel?jpB?=?new?JPanel(new?BorderLayout());
jpB.add(jtpb);
jtpTotal.add("模塊二",?jpB);
JTabbedPane?jtpc?=?new?JTabbedPane();
jtpc.setTabPlacement(JTabbedPane.LEFT);
JPanel?jp7?=?new?JPanel();
JPanel?jp8?=?new?JPanel();
JPanel?jp9?=?new?JPanel();
jtpc.add("選項七",?jp7);
jtpc.add("選項八",?jp8);
jtpc.add("選項九",?jp9);
JPanel?jpC?=?new?JPanel(new?BorderLayout());
jpC.add(jtpc);
jtpTotal.add("模塊三",?jpC);
add(jtpTotal);
setTitle("主窗口");//?標題
setSize(620,?480);//?大小
setLocationRelativeTo(null);//?居中
setDefaultCloseOperation(EXIT_ON_CLOSE);//?關閉窗口後退出程序
setVisible(true);//?窗口可見
}
public?static?void?main(String[]?args)?{
new?SwingDemo();
}
@Override
public?void?actionPerformed(ActionEvent?e)?{//點擊修改jp3的顏色
if(e.getSource()==jb){//如果是jb按鈕被點擊
jp3.setBackground(new?Color(getInt(),getInt(),getInt()));//那麽修改jp3的背景色
}
}
public?int?getInt(){//隨機產生0~255之間的數字,用於生成隨機顏色r,g,b
return?(int)?(Math.random()*256);
}
}
//註意,此類用於修改外觀JTabbedPane
class?TPUI?extends?BasicTabbedPaneUI?{
public?static?ComponentUI?createUI(JComponent?c)?{
return?new?TPUI();
}
@Override
protected?void?paintTabBorder(Graphics?g,?int?tabPlacement,?int?tabIndex,?int?x,?int?y,?int?w,?int?h,
boolean?isSelected)?{
if?(isSelected)?{//如果該標簽被選中,?那麽繪制矩形
g.setColor(new?Color(116,?168,?231));
g.fillRect(x?+?w?-?10,?y,?x+w,?h);
}else{//沒有被選中時的邊框,?也可以不用繪制
g.setColor(new?Color(116,?168,?231));
g.drawRect(x?+?w?-?8,?y,?x+w,?h);
}
}
@Override
protected?void?paintTabBackground(Graphics?g,?int?tabPlacement,?int?tabIndex,?int?x,?int?y,?int?w,?int?h,
boolean?isSelected)?{
g.setColor(Color.RED);
super.paintTabBackground(g,?tabPlacement,?tabIndex,?x,?y,?w,?h,?false);
//?最後壹個參數?true繪制背景色.false不繪制
//?如果參數是isSelected?,那麽選中就繪制背景色,不選中就不繪制
}
}