我可以在 JEditorPane 上方但在 JTabbedPane 下方获得 JTextField 吗?

Posted

技术标签:

【中文标题】我可以在 JEditorPane 上方但在 JTabbedPane 下方获得 JTextField 吗?【英文标题】:Can I get a JTextField above an JEditorPane but below a JTabbedPane? 【发布时间】:2014-02-13 08:26:56 【问题描述】:

我正在开发一个带有标签的简单网络浏览器。我在标签窗格下方添加文本字段时遇到了很多麻烦,就像它在 chrome 中一样。继承人我到目前为止: 公共类浏览器 私有 JFrame 框架; 私人 JPanel 面板顶部; 私人 JEditorPane 编辑器; 私人 JScrollPane 滚动; 私有 JTextField 字段; 私有 JButton 按钮; 私人 JButton 住宅; 私人网址网址; 私有 JMenu 文件 = new JMenu("文件"); 私人 JMenuItem 出口 = 新 JMenuItem("Exit"); 私人 JMenuBar menuBar = new JMenuBar(); 私人 ImageIcon nt = new ImageIcon("./Icons/newTab.jpg"); 私有 ImageIcon cl = new ImageIcon("./Icons/close.png"); 私有 JButton newTab = new JButton(cl); 私人 JTabbedPane tabbedPane = new JTabbedPane(); 私人 int tabCounter = 0; 私人维度暗淡=新维度(nt.getIconWidth()+2, nt.getIconHeight()+2); 公共浏览器() 初始化组件();

    frame = new JFrame();
    frame.setTitle("TeslaNet Browser");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800,600);

    frame.setJMenuBar(menuBar);
    menuBar.add(file);
    file.add(exit);

    exit.addActionListener(new ActionListener()
    
        public void actionPerformed(ActionEvent e)
        
            System.exit(0);
        
    );

    panelTop = new JPanel();
    frame.add(BorderLayout.NORTH, panelTop);
    panelTop.add(field);
    panelTop.add(button);
    panelTop.add(home);
    panelTop.add(newTab);

    newTab.addActionListener(new ActionListener()
        public void actionPerformed(ActionEvent e)
        
            initComponents();
        
    );
    newTab.setToolTipText("New Tab");
    newTab.setPreferredSize(dim);

    JPanel topPanel = new JPanel();
    topPanel.setLayout(new BorderLayout());
    frame.add(topPanel);
    topPanel.add(tabbedPane, BorderLayout.CENTER);

    panelTop.add(scroll, BorderLayout.CENTER);
    frame.setVisible(true);

private void initComponents()

    try
    
        url = new URL("http://www.reddit.com");
    
    catch(MalformedURLException mal)
    
        JOptionPane.showMessageDialog(null,mal);
    

    try
    
        editor = new JEditorPane(url);
        editor.setEditable(false);
    
    catch(IOException ioe)
    
        JOptionPane.showMessageDialog(null,ioe);
    

    scroll = new JScrollPane(editor, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

    field = new JTextField(14);

    SwingUtilities.invokeLater(new Runnable()
    
       public void run()
       
           field.setText(url.toString());
       
    );

    button = new JButton("Go");
    button.addActionListener(new ActionListener()
    
        public void actionPerformed(ActionEvent e)
        
            try
            
                editor.setPage(field.getText());
            

            catch(IOException ioe)
            
                JOptionPane.showMessageDialog(null, ioe);
            
        
    );

    home = new JButton("Home");
    home.addActionListener(new ActionListener()
    
        public void actionPerformed(ActionEvent e)
        
            try
            
                url = new URL("http://www.thissongissick.com");
                field.setText(url.toString());
            

            catch(MalformedURLException mal)
            
                JOptionPane.showMessageDialog(null,mal);
            

            try
            
                editor.setPage(field.getText());
            

            catch(IOException ioe)
            
                JOptionPane.showMessageDialog(null, ioe);
            
        
    );        
    JPanel tab = new JPanel();

    JButton closeButton = new JButton(nt);
    closeButton.addActionListener(new ActionListener() 
    
        public void actionPerformed(ActionEvent e) 
        
            tabbedPane.remove(tabbedPane.getTabCount()-1);
        
      );
    closeButton.setPreferredSize(dim);
    closeButton.setToolTipText("Close");


    JLabel tabLabel = new JLabel("Tab " + (++tabCounter));
    System.out.print(tabbedPane.getSelectedIndex());
    tab.setOpaque(false);

    tab.add(tabLabel, BorderLayout.WEST);
    tab.add(closeButton, BorderLayout.EAST);

    tabbedPane.addTab(null, editor);
    tabbedPane.setTabComponentAt(tabbedPane.getTabCount()-1, tab);


谢谢!

【问题讨论】:

请发布一个包含所有字段和初始化的可编译示例。 请注意,您的问题几乎肯定出在布局管理器而不是单个组件上,所以我编辑了您的标签 我已经添加了初始化以及使用的其他方法 【参考方案1】:

看看这个例子。我不想尝试猜测哪些变量适用于哪个组件,所以我想出了一个类似的例子。你需要做的就是把你想要的一切都放在一个标签中,inside标签的面板。所以基本上每个面板都有自己的自己的文本字段和编辑器窗格

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

public class Browser1 
    private JTabbedPane tabbedPane;
    private final JButton add;
    int i = 1;

    public Browser1() 
        tabbedPane = new JTabbedPane();
        tabbedPane.add(new JScrollPane(createTabbedPanel()), "Tab " + i);

        add = new JButton("Add Tab");
        add.addActionListener(new ActionListener()
            @Override
            public void actionPerformed(ActionEvent e) 
                i++;
                tabbedPane.add(new JScrollPane(createTabbedPanel()), "Tab " + i);
            
        );

        JFrame frame = new JFrame("Browser");
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
        buttonPanel.add(add);
        frame.add(buttonPanel, BorderLayout.PAGE_START);
        frame.add(tabbedPane);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    

    private JPanel createTabbedPanel() 
        JPanel panel = new JPanel(new BorderLayout());
        JTextField field = new JTextField(50);
        JEditorPane pane = new JEditorPane();
        pane.setPreferredSize(new Dimension(700, 500));

        panel.add(field, BorderLayout.NORTH);
        panel.add(pane, BorderLayout.CENTER);
        return panel;
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new Runnable()
            @Override
            public void run() 
                new Browser1();
            
        );
    

【讨论】:

非常感谢!!!这实际上也帮助我意识到了代码中的一个重大缺陷

以上是关于我可以在 JEditorPane 上方但在 JTabbedPane 下方获得 JTextField 吗?的主要内容,如果未能解决你的问题,请参考以下文章

jEditorPane 作为网络浏览器

聊天室的 JTextPane 或 JEditorPane

支持 Javascript 和 CSS 的 JEditorPane

Java - 在 JEditorPane 中设置选择的字体大小?

创建一个 jEditorPane 的缩略图,文本不呈现

跳转到 JEditorPane 中的内部锚点