I would like to create a textwidget / component that looks like a firefox address bar. I mean a text field that allows me to put small buttons inside the field (e.g. cancel / reload / ...)
I tried setting up JLayeredPane by creating my own layout manager that maximizes the text box and places the remainder from right to left. My problem is that it gave problems with the picture, I would not always see the elements that I added in the text box. This may be due to Jython, I'm trying to send java.lang.Integer(1)
to JLayeredPane.add
. However, the layers are ordered exactly according to the documentation.
To do this, I derived my own JLayeredPane
class and redefined paint
to call paintComponents
, which, in turn, iterates over all components and calls their drawing method, starting with a text field and then the rest.
However, I do not always receive updates immediately, that is, the buttons are hidden / only partially displayed, and I can not interact with the button.
- What do I need to see the update on the screen (is it hidden in the buffer?))
- How can I make it so that I can interact with buttons?
- How can I shorten Texxtfield so that the text starts to scroll forward before I get to the end of the text field so that the text is not hidden by buttons? I still want the Textfields to expand under the buttons
edit : the button only appears in the right place after I make the window smaller, after which it can also be clicked
edit2 : I took the liberty of boiling the answer to this question, which hides a lot of this button code / unnecessary stuff.
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(); } }); } }