Java swing 1.6 Textinput就像firefox吧

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

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

为了实现这个目的,我派生了我自己的JLayeredPane类并重新定义了paint来调用paintComponents ,而paintComponents又遍历所有组件并调用它们的paint方法,从文本框开始,其余部分。

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

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

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

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(); } }); } } 

也许可以通过使用JMenuBar简单,例如Auto Complete ComboBox / JFextField

在此处输入图像描述

 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]]

在此处输入图像描述

使用适当的LayoutManager

 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(); } }); } } 

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