2013-08-25 175 views
0

我在使用名为FilePanel自定义类选项卡窗格的选项卡,这是什么使这是一个有点混乱。它用于保存和加载文件,因此是类文件面板。我想在每个选项卡的右侧添加一个图标的小按钮。点击时它应该关闭该特定标签。添加按钮到标签

文件面板类:

package texteditor; 
import java.util.*; 
import java.io.*; 
import javax.swing.*; 
import java.io.File.*; 
import java.awt.*; 
import javax.swing.filechooser.FileNameExtensionFilter; 

class FilePanel extends JPanel { 

    private File file; 
    private JTextArea textArea; 
    private String name; 


    public FilePanel(File file) throws FileNotFoundException, IOException { 
     this.file = file; 
     setLayout(new BorderLayout()); 

     textArea = new JTextArea(); 
     JScrollPane scroll = new JScrollPane(textArea); 
     add(scroll, BorderLayout.CENTER); 

     textArea.read(new FileReader(file.getAbsolutePath()), null); 
     name = file.getName(); 


    } 

    public FilePanel() { 

     try 
     { 
     setLayout(new BorderLayout()); 

     textArea = new JTextArea(); 
     JScrollPane scroll = new JScrollPane(textArea); 
     add(scroll, BorderLayout.CENTER); 

     textArea.read(new FileReader(file.getAbsolutePath()), null); 
     name = file.getName(); 


     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 

    } 

    public File getFile() { 
     return file; 
    } 

    public JTextArea getTextArea() { 
     return textArea; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

添加新的帧的方法:我在努力,但

private void btnNewActionPerformed(java.awt.event.ActionEvent evt) {          
     increment++; 

     try 
     { 
      FilePanel p = new FilePanel(); 
      p.setName("File " + increment); 

      //code im testing goes here and I just remove the 3 you see below. 
      tabbedPane.add(p); 
      tabbedPane.setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0)); 
      tabbedPane.setSelectedComponent(p); 

     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 

代码无济于事:

Icon icon = new ImageIcon(getClass().getResource("redclose.png")); 
     JButton butt = new JButton(); 
     butt.setIcon(icon); 
     butt.setIconTextGap(5); 
     butt.setHorizontalTextPosition(SwingConstants.RIGHT); 
     tabbedPane.setTabComponentAt(0, butt); 

这适用于只是图标本身:

Icon icon = new ImageIcon(getClass().getResource("redclose.png")); 
      tabbedPane.setIconAt(tabbedPane.getSelectedIndex(), icon); 
+0

你应该看看'setTabComponentAt(INT,组件)'; –

回答

1

以下是可关闭的选项卡会是什么样一个简单的例子:

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTabbedPane; 
import javax.swing.border.EmptyBorder; 

public class ClosableTab extends JPanel implements ActionListener{ 

    private final JTabbedPane pane; 
    private final int index; 

    private JButton closeButton; 

    private JLabel titleLabel; 

    public ClosableTab(final JTabbedPane pane, final int index){ 
     super(new BorderLayout()); 
     setOpaque(false); 

     this.pane = pane; 
     this.index = index; 

     titleLabel = new JLabel(pane.getTitleAt(index)); 
     titleLabel.setHorizontalAlignment(JLabel.CENTER); 

     closeButton = new JButton("X"); 
     closeButton.setBorder(new EmptyBorder(-5, 2, -5, 0)); 
     closeButton.setOpaque(false); 
     closeButton.setContentAreaFilled(false); 
     closeButton.setFont(closeButton.getFont().deriveFont(20F)); 
     closeButton.setForeground(Color.RED); 
     closeButton.addActionListener(this); 

     add(titleLabel, BorderLayout.CENTER); 
     add(closeButton, BorderLayout.EAST); 

     setPreferredSize(getPreferredSize()); 
    } 

    public void actionPerformed(ActionEvent e){ 
     final Object source = e.getSource(); 
     if(source.equals(closeButton)){ 
      pane.remove(pane.indexOfTabComponent(this)); 
      pane.revalidate(); 
      pane.repaint(); 
     } 
    } 

    public void apply(){ 
     pane.setTabComponentAt(index, this); 
     pane.revalidate(); 
     pane.repaint(); 
    } 

    public static void apply(final JTabbedPane pane, final int index){ 
     new ClosableTab(pane, index).apply(); 
    } 

} 

您添加FilePanel后,尝试调用ClosableTab.apply(tabbedPane, tabbedPane.getTabCount()-1);

+0

谢谢你的例子。我发现的问题是将其与我的代码集成。我需要使用FilePanel。我只是不知道如何结合一个面板内的FilePanel和按钮添加到TabbedPane – Steve

+0

@Steve我需要略微重构我的代码,我会在几分钟内完成(现在在移动设备上)也会告诉你如何使用它。 –

+0

@Steve请参阅编辑。 –