3

我写了下面的代码,它有一个文本字段和一个按钮。只要输入一个字符并按下按钮,就会创建一个选项卡,其标题与在字段中输入的内容相同。

可以以相同的方式创建多个选项卡......现在再次在新选项卡中,一个文本字段和一个按钮存在一个很长的文本窗格以显示结果......

我想在每个选项卡的文本窗格中显示输入到文本字段中的文本...

现在请引导我了解如何以及在何处放置选项卡按钮的侦听器......并推荐任何其他所需的侦听器(我认为应该有另一个侦听器将我引导到焦点或选定的选项卡)。

应该提到的是,我已将这些选项卡添加到数组列表中以供重复使用,但我不知道我是否做得对或如何使用它?

package test;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;

public class TestGUI extends JFrame {


    private JTextField jTextField1;
    private JButton jButton1;
    static ArrayList<JPanel> ary = new ArrayList<JPanel>();
    private int tabIndex = 0;
    static int index = 0;
    private JTabbedPane tabbedPane;

    /**
    * @param args
    */
    public TestGUI() {

        super("Testing Tab Frame");
        setLayout(null);

        Handler but1 = new Handler();

        jTextField1 = new JTextField();
        jTextField1.setVisible(true);
        jTextField1.setBounds(12, 12, 85, 30);
        add(jTextField1);

        jButton1 = new JButton("Button1");
        jButton1.setVisible(true);
        jButton1.setBounds(130, 12, 85, 30);
        add(jButton1);
        jButton1.addActionListener(but1);

        tabbedPane = new JTabbedPane();
        tabbedPane.setBounds(12, 54, 200, 150);
        tabbedPane.setVisible(false);
        add(tabbedPane);
        pack();
        setSize(250, 110);
        setLocationRelativeTo(null);

    }

    private class Handler implements ActionListener {

        public void actionPerformed(ActionEvent evt) {
            String input = jTextField1.getText();
            if (!input.isEmpty()) {
                setSize(250, 250);
                JPanel inst = createPanel(input);
                inst.setVisible(true);
                tabbedPane.addTab(Integer.toString(tabIndex), inst);
                tabbedPane.setVisible(true);
            }

        }
    }

    protected JPanel createPanel(String input) {
        JPanel inst = new JPanel();
        inst.setVisible(true);
        JTextField textField = new JTextField();
        textField.setVisible(true);
        textField.setBounds(12, 12, 80, 30);
        JButton button = new JButton();
        button.setVisible(true);
        button.setBounds(100, 12, 80, 30);
        JTextPane textPane = new JTextPane();
        textPane.setBounds(12, 54, 168, 40);
        inst.add(textPane);
        textPane.setVisible(true);
        inst.setLayout(null);
        inst.add(button);
        inst.add(textField);
        ary.add(inst);
        tabIndex = index;
        index++;
        return inst;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestGUI inst = new TestGUI();
        inst.setVisible(true);
    }

}
4

3 回答 3

6

您将添加到您的方法ActionListener内的按钮。createPanel因此,您的方法将是这样的(由于不清楚,因此对您实际想要对文本执行的操作做出一些假设):

protected JPanel createPanel(String input) {
    JPanel inst = new JPanel();
    inst.setVisible(true);
    final JTextField textField = new JTextField();
    textField.setVisible(true);
    textField.setBounds(12, 12, 80, 30);
    JButton button = new JButton();        
    button.setVisible(true);
    button.setBounds(100, 12, 80, 30);
    final JTextPane textPane = new JTextPane();
    textPane.setBounds(12, 54, 168, 40);
    inst.add(textPane);
    textPane.setVisible(true);

    button.addActionListener(new ActionListener(){

        @Override
        public void actionPerformed(ActionEvent arg0) {
            textPane.setText(textPane.getText() + textField.getText());
        }});

    inst.setLayout(null);
    inst.add(button);
    inst.add(textField);
    ary.add(inst);
    tabIndex = index;
    index++;
    return inst;
}
于 2012-08-09T00:49:59.717 回答
4

此处显示的修改TabComponentsDemo显示了一种重命名选项卡的方法。它在每个窗格上听 a ,但 a上的 a也应该服务。JButtonActionListenerJTextField

于 2012-08-09T00:20:34.470 回答
3

可用于使用户界面更健壮的各种要点:

  • 从绝对定位开始真的不是一个好主意。请阅读链接的第一段,以了解更多关于为什么不鼓励使用 LayoutManagers的方法的信息。
  • 无需像在代码中那样显式使用setVisible(true);各种 JComponents,因为当您使父组件可见时,所有子组件都将同样设置为可见。
  • 像这样的调用pack()/setVisible(true/false)必须在 EDT 事件调度线程上完成,而不是从 main 方法调用它们。有关更多信息,请阅读Swing 中的并发

看看你的这个修改过的代码,如果你需要更多的了解,请询问:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class TestGUI extends JFrame {

    private JPanel contentPane;
    private JTextField jTextField1;
    private JButton jButton1;
    static ArrayList<JPanel> ary = new ArrayList<JPanel>();
    private int tabIndex = 0;
    static int index = 0;
    private JTabbedPane tabbedPane;

    public TestGUI() {

        super("Testing Tab Frame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        Handler but1 = new Handler();
        JPanel footerPanel = new JPanel();

        jTextField1 = new JTextField(10);
        footerPanel.add(jTextField1);

        jButton1 = new JButton("Create TAB");
        footerPanel.add(jButton1);
        jButton1.addActionListener(but1);

        tabbedPane = new JTabbedPane();

        contentPane.add(tabbedPane, BorderLayout.CENTER);
        contentPane.add(footerPanel, BorderLayout.PAGE_END);   

        setContentPane(contentPane);    
        setSize(300, 300);
        setLocationRelativeTo(null);
    }

    private class Handler implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent evt) {
            String input = jTextField1.getText();
            if (!input.isEmpty()) {

                JPanel inst = createPanel();                
                tabbedPane.addTab(input, inst);
                ary.add(inst);              

                jTextField1.setText("");
                contentPane.revalidate();
                contentPane.repaint();              
            }
        }
    }

    protected JPanel createPanel() {

        JPanel inst = new JPanel();
        inst.setLayout(new BorderLayout(5, 5));

        final JTextPane textPane = new JTextPane();

        JPanel footerPanel = new JPanel();
        final JTextField textField = new JTextField(10);
        JButton button = new JButton("SHOW");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (textField.getDocument().getLength() > 0)
                    textPane.setText(textField.getText());
                textField.setText("");  
            }
        });
        footerPanel.add(textField);
        footerPanel.add(button);

        inst.add(textPane, BorderLayout.CENTER);
        inst.add(footerPanel, BorderLayout.PAGE_END);    

        return inst;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                TestGUI inst = new TestGUI();
                inst.setVisible(true);
            }
        });
    }

}
于 2012-08-09T06:24:44.340 回答