我想创建一个看起来像 Firefox 地址栏的文本小部件/组件。我的意思是一个文本字段,它允许我在字段内放置小按钮(例如取消/重新加载/...)
我尝试自定义一个 JLayeredPane,通过创建一个自定义布局管理器来最大化文本字段,并将其余部分从右到左放置。我的问题是这给了绘画问题,我不会总是看到我在文本字段中添加的项目。这可能与 Jython 相关,我尝试补充java.lang.Integer(1)
到JLayeredPane.add
. 然而,图层的顺序与文档所说的完全相反。
为了解决这个问题,我派生了我自己的JLayeredPane
类并重新定义paint
为 callpaintComponents
它依次遍历所有组件并调用它们的绘制方法,从文本框开始,然后是其余的。
但是我并不总是立即获得更新,这意味着按钮被隐藏/仅部分显示并且我无法与按钮交互。
- 我必须怎样才能在屏幕上看到更新(它是否隐藏在缓冲区中?))
- 我怎样才能做到这一点,以便我可以与按钮交互?
- 如何缩短 Texxtfield,以便在到达 Textfield 末尾之前文本开始滚动到前面,这样文本不会被按钮隐藏?我仍然希望 Textfields 区域在按钮下扩展
编辑:按钮仅在我缩小窗口后显示在正确的位置,之后它也可以点击
编辑2:我自由地将答案归结为这个,它隐藏了很多按钮代码/不必要的东西
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();
}
});
}
}