[Java的挥杆] JTabbedPane的自定义
在我以前的文章介绍 JTabbenPane 一些基本要点, 本文中,我们发现多一点 可定制的JTabbedPane 为更好吃得, 像下面的图片, 有关闭标签, 更多标签,…
其中最重要的是我们如何要添加新的选项卡按钮, 如何在每个选项卡它关闭按钮选项卡. 我们将创造 2 文件, 1 执行自定义的文件标签 (有JLabel的当前选项卡的标题和关闭按钮选项卡) 和 1 创建基于文件的标签JTabbedPane中在其他文件中被定制.
添加新的选项卡和事件的JTabbedPane
关于创建新的选项卡按钮来添加我们生产的物质 1 标签标题加 (“+”) 实施开始改变事件的JTabbedPane. 只要点击切换标签, 如果您单击此选项卡上,执行更 1 新标签. 下面是创建自定义文件中的代码JTabbedPane中.
package nguyenvanquan7826.JTabbedPane; import java.awt.Color; import java.awt.GridLayout; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.JTextArea; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; /** * --------------------- @author nguyenvanquan7826 --------------------- * ------------------ website: cachhoc.net ------------------- * ---------- date: Jul 24, 2014 - filename: DemoCustomJTabPane.java ---------- */ public class DemoCustomJTabbedPane extends JFrame { JTabbedPane tabbedPane; int numTabs; public DemoCustomJTabbedPane() { createGUI(); setDisplay(); } /** set diplay for JFrame */ private void setDisplay() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(450, 300); setLocationRelativeTo(null); setVisible(true); } /** set title and add JTabbedPane into JFrame */ private void createGUI() { setTitle("Demo custum JTabbedPane"); createJTabbedPane(); add(tabbedPane); } /** create JTabbedPane contain 2 tab */ private void createJTabbedPane() { /* create JTabbedPane */ tabbedPane = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.SCROLL_TAB_LAYOUT); /* add first tab */ tabbedPane.add(createJPanel(), "Tab " + String.valueOf(numTabs), numTabs++); tabbedPane.setTabComponentAt(0, new DemoCustomTab(this)); /* add tab to add new tab when click */ tabbedPane.add(new JPanel(), "+", numTabs++); tabbedPane.addChangeListener(changeListener); } /** create JPanel contain a JLabel */ private JPanel createJPanel() { JPanel panel = new JPanel(new GridLayout(1, 1)); panel.add(new JScrollPane(createTextArea(10, 40))); return panel; } private JTextArea createTextArea(int row, int col) { JTextArea ta = new JTextArea(row, col); ta.setWrapStyleWord(true); ta.setLineWrap(true); ta.setForeground(Color.BLUE); return ta; } ChangeListener changeListener = new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { addNewTab(); } }; private void addNewTab() { int index = numTabs - 1; if (tabbedPane.getSelectedIndex() == index) { /* if click new tab */ /* add new tab */ tabbedPane.add(createJPanel(), "Tab " + String.valueOf(index), index); /* set tab is custom tab */ tabbedPane.setTabComponentAt(index, new DemoCustomTab(this)); tabbedPane.removeChangeListener(changeListener); tabbedPane.setSelectedIndex(index); tabbedPane.addChangeListener(changeListener); numTabs++; } } public void removeTab(int index) { tabbedPane.remove(index); numTabs--; if (index == numTabs - 1 && index > 0) { tabbedPane.setSelectedIndex(numTabs - 2); } else { tabbedPane.setSelectedIndex(index); } if (numTabs == 1) { addNewTab(); } } public static void main(String[] args) { new DemoCustomJTabbedPane(); } }
你有没有在网上发现 51 我们增加了第一个选项卡像往常一样, 那么行 53 我们执行 setTabComponentAt 用自定义选项卡替换默认选项卡中,我们 (下面的代码) 关闭标签页按钮.
当前 58 实施事件侦听器JTabbedPane中的选项卡转移.
方法 addNewTab 执行更多的新标签. 请注意,行 91, 添加新选项卡之后,我们需要中断JTabbedPane中的收听因为否则的条件 tabbedPane.getSelectedIndex() ==指数 总是正确的,它需要许多标签. 中断听完之后, 我们把标签被选定为新创建的选项卡,然后听背部安装.
方法 removeTab 在位置完成后关闭的标签 指数. 注意if-else语句首先检查,如果上次关闭的标签,标签将集中于前, 其标签后否则将集中在. 第二if语句 2 要检查标签的封闭端 (只需添加标签按钮) 它会自动生成 1 新标签.
添加一个关闭按钮选项卡的JTabbedPane
在关闭标签按钮, 执行自定义组件 (零件) 该选项卡 1 的JPanel, 此JPanel包含 1 JLabel的显示标题 (称号) 标签, 1 JButton的赶上这样关闭标签页的事件
下面是自定义选项卡上的代码
package nguyenvanquan7826.JTabbedPane; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.border.EtchedBorder; /** * --------------------- @author nguyenvanquan7826 --------------------- * ------------------ website: cachhoc.net ------------------- * ---------- date: Jul 24, 2014 - filename: DemoButtonTab.java ---------- */ public class DemoCustomTab extends JPanel { DemoCustomJTabbedPane customJTabbedPane; /** JPanel contain a JLabel and a JButton to close */ public DemoCustomTab(DemoCustomJTabbedPane customJTabbedPane) { this.customJTabbedPane = customJTabbedPane; setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0)); setBorder(new EmptyBorder(5, 2, 2, 2)); setOpaque(false); addLabel(); add(new CustomButton("x")); } private void addLabel() { JLabel label = new JLabel() { /** set text for JLabel, it will title of tab */ public String getText() { int index = customJTabbedPane.tabbedPane .indexOfTabComponent(DemoCustomTab.this); if (index != -1) { return customJTabbedPane.tabbedPane.getTitleAt(index); } return null; } }; /** add more space between the label and the button */ label.setBorder(new EmptyBorder(0, 0, 0, 10)); add(label); } class CustomButton extends JButton implements MouseListener { public CustomButton(String text) { int size = 15; setText(text); /** set size for button close */ setPreferredSize(new Dimension(size, size)); setToolTipText("close the Tab"); /** set transparent */ setContentAreaFilled(false); /** set border for button */ setBorder(new EtchedBorder()); /** don't show border */ setBorderPainted(false); setFocusable(false); /** add event with mouse */ addMouseListener(this); } /** when click button, tab will close */ @Override public void mouseClicked(MouseEvent e) { int index = customJTabbedPane.tabbedPane .indexOfTabComponent(DemoCustomTab.this); if (index != -1) { customJTabbedPane.removeTab(index); } } @Override public void mousePressed(MouseEvent e) { } @Override public void mouseReleased(MouseEvent e) { } /** show border button when mouse hover */ @Override public void mouseEntered(MouseEvent e) { setBorderPainted(true); setForeground(Color.RED); } /** hide border when mouse not hover */ @Override public void mouseExited(MouseEvent e) { setBorderPainted(false); setForeground(Color.BLACK); } } }
在这堂课,我们有 1 对象DemoCustomJTabbedPane, 传递给我们的,你注意到我们已经提到了前面的代码创建的对象 新DemoCustomTab(此). 的目的是将其发送出去来获得JTabbedPane的持续, 我们将与它同时也再次执行关闭标签页. 具体而言,:
你看这个类继承的JPanel所以它是 1 JPanel的,因为我们希望. 我们执行在该行设定的JLabel和JButton的在里面 30 和 31.
方法 addLabel JLabel的JPanel的进入做多. 但是,我们需要采取的选项卡的标题揭示的JLabel被改写功能 的getText JLabel中执行搜索到JTabbedPane中的当前选项卡拿冠军.
添加简单的JButton创建 1 JButton对象,文本 “X” 但是如果你这样做那么这将是非常响亮的JButton坏, 所以我也通过自定义类的JButton这样做 的CustomButton.
本A类 实现的MouseListener 实现鼠标的所有事件. 当鼠标悬停在关闭按钮,该方法 的mouseEntered 将执行和颜色会变为红色, 边界和 1 文本工具提示弹出 “关闭选项卡”. 时取出,将小鼠返回到正常借助于 的mouseExited.
为了获得需要的东西把一些价值,它作为:
– 置于适当大小: 有必要对setPreferredSize(新维度(尺寸, 尺寸));
– 制作透明按钮: setContentAreaFilled(假);
– 设置边界: setBorder(新EtchedBorder()); setBorderPainted(假);
当您单击按钮来关闭标签的方法 的mouseClicked 已知的和实现的方法调用 removeTab 的 DemoCustomJTabbedPane 收的标签.
哦,你有什么我的CustomButton一定不是他的内部类
没有NHE您.
包的TabbedPane;
进口java.awt.event.MouseListener;
进口java.awt.event.MouseEvent中;
进口javax.swing.JLabel中;
进口javax.swing.JButton中;
@SuppressWarnings(“串行”)
公共类CustomPanel扩展javax.swing.JPanel中{
私人的TabbedPane选项卡窗格;
私人的JLabel labelTitle;
私人JButton的buttonClose;
公共CustomPanel(TabbedPane的OBJ) {
选项卡窗格= OBJ;
SetOpaque(真正);
的setSize(75, 25);
的setLayout(新java.awt.GridLayout中());
添加(createLabelTitle());
添加(createButtonClose());
listenEvent();
}
私人的JLabel createLabelTitle() {
labelTitle =新的JLabel() {
公共字符串的getText() {
INT指数= tabbedPane.tabbedPane.indexOfComponent(CustomPanel.this);
如果(指数 != -1)
返回tabbedPane.tabbedPane.getTitleAt(指数);
其他
返回NULL;
}
};
返回labelTitle;
}
私人JButton的createButtonClose() {
buttonClose =新的JButton(“X”);
buttonClose.setToolTipText(“关闭此选项卡”);
buttonClose.setPreferredSize(新java.awt.Dimension中(15, 15));
buttonClose.setBorderPainted(假);
buttonClose.setContentAreaFilled(假);
buttonClose.setBorder(新javax.swing.border.EtchedBorder中());
buttonClose.setFocusable(假);
返回buttonClose;
}
私人无效listenEvent() {
为(java.awt.Component中的补偿: getComponents())
如果(补偿的instanceof的JButton) {
JButton的按钮= (JButton的)补偿;
button.addMouseListener
(
新的MouseListener() {
公共无效的mouseClicked(的MouseEvent事件) {
INT指数= tabbedPane.tabbedPane.indexOfComponent(CustomPanel.this);
如果(指数 != -1)
tabbedPane.removeTabClick(指数);
否则返回;
}
公共无效的mouseEntered(的MouseEvent事件) {
buttonClose.setBorderPainted(真正);
buttonClose.setBackground(java.awt.Color.red);
}
公共无效的mouseExited(的MouseEvent事件) {
buttonClose.setBorderPainted(假);
buttonClose.setBackground(java.awt.Color.black);
}
公共无效的mousePressed(的MouseEvent事件) {
}
公共无效的mouseReleased(的MouseEvent事件) {
}
}
);
}
其他;
}
}
没有高古HIEN labeltitle和buttonclose弓蝙蝠事件
您可以编辑或删除任何部分变为无? 按需还在外面哪个
他的代码当时customButtom 1 类. 我的时间越长,按钮是 1 对象CUA类的JButton. 因为虽然它也延伸的JButton 1 唯一的按钮. 孩子们不喜欢,因为他的代码像上面就是我的风格的代码. 修改后的代码就是这样,但不删除任何东西. 他的代码,然后运行正常. 所以你的代码应该不会发布更多的TabbedPane确定在这里, 它没有目前的TabbedPane标题和不removetab定。(代码removeTABcũng确定). 如果是这样CutomButton是 1 类(柯内) 运行良好. 但为什么添加到这个面板作为当前标题和再劫劫按钮点击事件,但事件中设置地面状态仍为鼠标悬停.
他索里. 通过代码复制和粘贴,但没有那么小瑕疵. indexOfTabComponent无字标签. 感谢他代表.