Java swing 1.6 Textinput就像firefox吧

时间:2012-05-31 20:03:34

标签: java swing awt jbutton jtextfield

我想创建一个看起来像firefox地址栏的textwidget / component。我的意思是一个Textfield,它允许我在场内放置小按钮(例如取消/重新加载/...)

我尝试通过创建自定义布局管理器来自定义JLayeredPane,该管理器最大化Textfield,并将其余部分从右到左放置。我的问题是这给了绘画问题,我不会总是看到我在文本字段中添加的项目。这可能与Jython有关,我尝试将java.lang.Integer(1)提供给JLayeredPane.add。然而,层的排序与文档所说的完全相反。

为了实现这一目标,我派生了自己的JLayeredPane类并重新定义paint来调用paintComponents,后者又遍历所有组件并调用其绘制方法,从文本框开始,其余的此后。

但是我并不总是立即得到更新,这意味着按钮被隐藏/仅部分显示,我无法与按钮交互。

  1. 我有什么可以在屏幕上看到更新(隐藏在缓冲区?)。
  2. 我怎样才能使它与按钮互动?
  3. 如何缩短Texxtfield,以便文本在到达Textfield的末尾之前开始滚动到前面,以便文本不会被按钮隐藏?我仍然希望Textfields区域在按钮
  4. 下扩展

    编辑:在我缩小窗口后,该按钮仅显示在正确的位置,之后它也可以点击

    EDIT2 : 我自由地将答案归结为此,隐藏了很多按钮代码/不必要的东西

    import java.awt.*;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import javax.swing.*;
    
    public class playground {
    
        private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
        private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
        private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");
    
        public playground() {
            JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());
    
            panel.add(makeButton(), BorderLayout.WEST);
    
            JTextField text = new JTextField(20);
            text.setBorder(null);
            panel.add(text, BorderLayout.CENTER);
            JPanel buttonsPanel = new JPanel();
            buttonsPanel.setOpaque(false);
            buttonsPanel.setLayout(new GridLayout(1, 2, 2, 2));
    
            buttonsPanel.add(makeButton());
            buttonsPanel.add(makeButton());
    
            panel.add(buttonsPanel, BorderLayout.EAST);
            panel.setBackground(text.getBackground());
    
            JMenuBar menuBar = new JMenuBar();
            menuBar.add(panel);
            menuBar.add(Box.createHorizontalGlue());
            JFrame frame = new JFrame("MenuGlueDemo");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(menuBar);
            frame.pack();
            frame.setVisible(true);
        }
    
        public JToggleButton makeButton() {
            final JToggleButton button = new JToggleButton();
            button.setFocusable(false);
            button.setMargin(new Insets(0, 0, 0, 0));
            button.setContentAreaFilled(false);
            button.setBorder(null);
    
            button.setIcon((errorIcon));
            button.setRolloverIcon((infoIcon));
            button.setSelectedIcon(warnIcon);
            button.setPressedIcon(warnIcon);
    
            button.addItemListener(new ItemListener() {
    
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (button.isSelected()) {
                    } else {
                    }
                }
            });
    
            return button;
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    playground menuGlueDemo = new playground();
                }
            });
        }
    }
    

2 个答案:

答案 0 :(得分:5)

可能很简单,只需使用JMenuBar,例如{/ 3}}

enter image description here

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

public class MenuGlueDemo {

    public MenuGlueDemo() {
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createMenu("Menu 1"));
        menuBar.add(createMenu("Menu 2"));
        menuBar.add(createMenu("Menu 3"));
        menuBar.add(new JSeparator());
        menuBar.add(new JButton("   Seach ....  "));
        menuBar.add(new JTextField("   Seach ....  "));
        menuBar.add(new JComboBox(new Object[]{"height", "length", "volume"}));
        menuBar.add(Box.createHorizontalGlue());
        menuBar.add(createMenu("About"));
        JFrame frame = new JFrame("MenuGlueDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar);
        frame.pack();
        frame.setVisible(true);
    }

    public JMenu createMenu(String title) {
        JMenu m = new JMenu(title);
        m.add("Menu item #1 in " + title);
        m.add("Menu item #2 in " + title);
        m.add("Menu item #3 in " + title);
        if (title.equals("About")) {
            m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }
        return m;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MenuGlueDemo menuGlueDemo = new MenuGlueDemo();
            }
        });
    }
}

修改

  

我可以简单但是文本输入和容器中的一些按钮具有适当的布局并实现[Textfield ...] [B1] [B2]但我想要[Textfield [B1] [B2]]

enter image description here

正确的Auto complete ComboBox / JFextField

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

public class MenuGlueDemo {

    private Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");
    private Icon infoIcon = UIManager.getIcon("OptionPane.informationIcon");
    private Icon warnIcon = UIManager.getIcon("OptionPane.warningIcon");

    public MenuGlueDemo() {
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        JButton button = new JButton();
        button.setFocusable(false);
        //button.setMargin(new Insets(0, 0, 0, 0));
        button.setContentAreaFilled(false);
        button.setIcon((errorIcon));
        button.setPressedIcon(warnIcon);
        panel.add(button, BorderLayout.WEST);
        JTextField text = new JTextField(20);
        text.setBorder(null);
        panel.add(text, BorderLayout.CENTER);
        JPanel buttonsPanel = new JPanel();
        buttonsPanel.setOpaque(false);
        buttonsPanel.setLayout(new GridLayout(1, 2, 2, 2));
        final JToggleButton toggleButton = new JToggleButton();
        toggleButton.setFocusable(false);
        toggleButton.setMargin(new Insets(0, 0, 0, 0));
        toggleButton.setContentAreaFilled(false);
        toggleButton.setIcon((errorIcon));
        toggleButton.setRolloverIcon((infoIcon));
        toggleButton.setSelectedIcon(warnIcon);
        toggleButton.setPressedIcon(warnIcon);
        toggleButton.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (toggleButton.isSelected()) {
                } else {
                }
            }
        });
        buttonsPanel.add(toggleButton);
        final JToggleButton toggleButton1 = new JToggleButton();
        toggleButton1.setFocusable(false);
        toggleButton1.setMargin(new Insets(0, 0, 0, 0));
        toggleButton1.setContentAreaFilled(false);
        toggleButton1.setIcon((errorIcon));
        toggleButton1.setRolloverIcon((infoIcon));
        toggleButton1.setSelectedIcon(warnIcon);
        toggleButton1.setPressedIcon(warnIcon);
        toggleButton1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                if (toggleButton1.isSelected()) {
                } else {
                }
            }
        });
        buttonsPanel.add(toggleButton1);
        panel.add(buttonsPanel, BorderLayout.EAST);
        panel.setBackground(text.getBackground());
        JMenuBar menuBar = new JMenuBar();
        menuBar.add(createMenu("Menu 1"));
        menuBar.add(createMenu("Menu 2"));
        menuBar.add(createMenu("Menu 3"));
        menuBar.add(new JSeparator());
        menuBar.add(new JButton("   Seach ....  "));
        menuBar.add(panel);
        menuBar.add(new JComboBox(new Object[]{"height", "length", "volume"}));
        menuBar.add(Box.createHorizontalGlue());
        menuBar.add(createMenu("About"));
        JFrame frame = new JFrame("MenuGlueDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(menuBar);
        frame.pack();
        frame.setVisible(true);
    }

    private JMenu createMenu(String title) {
        JMenu m = new JMenu(title);
        m.add("Menu item #1 in " + title);
        m.add("Menu item #2 in " + title);
        m.add("Menu item #3 in " + title);
        if (title.equals("About")) {
            m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
        }
        return m;
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                MenuGlueDemo menuGlueDemo = new MenuGlueDemo();
            }
        });
    }
}

答案 1 :(得分:5)

您可以调整Component Border中显示的方法,该方法允许“JTextFieldJButton一起工作。”相关文章Text Prompt也可能有用。最后,将JToolBar(图示为here)视为将组件绑定在一起的灵活方式。