Java Swing的1.6的TextInput如Firefox吧 [英] Java swing 1.6 Textinput like firefox bar
问题描述
我想创建一个textwidget /组件至极看起来像Firefox地址栏中。我的意思是文本字段至极让我把里面的字段小按钮(例如取消/重装/...)
我试图定制的JLayeredPane,通过创建最大化文本字段定制的布局管理器,并从右至左放置其余部分。我的问题是这样了绘画的问题,我不会总是看到我添加了文本字段的项目。这可能是Jython的关系,我尝试suppling java.lang.Integer中的(1)
到 JLayeredPane.add
。然而,图层排序正好相反的文件说什么。
要cricumvent这个我得出我自己的的JLayeredPane
类,并重新定义了油漆
调用 paintComponents
这反过来又遍历所有的组件,并调用其绘制方法,从文本框,其余其后。
不过,我并不总是得到更新向右走,这意味着按钮隐藏/只显示部分,我不能用按钮进行交互。
- 什么我都实际上可以在屏幕上看到此更新(它是在一个缓冲区隐藏?))
- 我怎样才能让这个我可以用按钮交互?
- 如何缩短Texxtfield,使文本开始滚动至前前我到了文本字段的结束,使文本没有得到通过按钮隐藏?我仍然希望文本框区域中的按键延长
修改:在我使窗口变小,之后,它也可点击该按钮只显示在正确的地方。
EDIT2 :
我把自由熬下来回答这个,隐藏走了很多的按钮code /不必要的东西。
进口java.awt中的*。
进口java.awt.event.ItemEvent中;
进口java.awt.event.ItemListener;
进口的javax.swing *。公共类操场{ 私人图标errorIcon = UIManager.getIcon(OptionPane.errorIcon);
私人图标infoIcon = UIManager.getIcon(OptionPane.informationIcon);
私人图标warnIcon = UIManager.getIcon(OptionPane.warningIcon); 公共运动场(){
的JPanel面板=新JPanel();
panel.setLayout(新的BorderLayout()); panel.add(makeButton(),BorderLayout.WEST); JTextField的文本=新的JTextField(20);
text.setBorder(NULL);
panel.add(文字,BorderLayout.CENTER);
JPanel的buttonsPanel =新JPanel();
buttonsPanel.setOpaque(假);
buttonsPanel.setLayout(新的GridLayout(1,2,2,2)); buttonsPanel.add(makeButton());
buttonsPanel.add(makeButton()); panel.add(buttonsPanel,BorderLayout.EAST);
panel.setBackground(text.getBackground()); 的JMenuBar菜单栏=新的JMenuBar();
menuBar.add(面板);
menuBar.add(Box.createHorizontalGlue());
JFrame的帧=新的JFrame(MenuGlueDemo);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(菜单栏);
frame.pack();
frame.setVisible(真);
} 公共JToggleButton中makeButton(){
最后JToggleButton中按钮=新JToggleButton中();
button.setFocusable(假);
button.setMargin(新插图(0,0,0,0));
button.setContentAreaFilled(假);
button.setBorder(NULL); button.setIcon((errorIcon));
button.setRolloverIcon((infoIcon));
button.setSelectedIcon(warnIcon);
button.set pressedIcon(warnIcon); button.addItemListener(新的ItemListener(){ @覆盖
公共无效itemStateChanged(一个ItemEvent E){
如果(button.isSelected()){
}其他{
}
}
}); 返回按钮;
} 公共静态无效的主要(字串[] args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){ @覆盖
公共无效的run(){
操场menuGlueDemo =新操场();
}
});
}
}
可能是它可以使用的的JMenuBar ,用的自动完成的ComboBox / JFextField 例如:
进口java.awt.ComponentOrientation中;
进口的javax.swing *。公共类MenuGlueDemo { 公共MenuGlueDemo(){
的JMenuBar菜单栏=新的JMenuBar();
menuBar.add(createMenu(菜单1));
menuBar.add(createMenu(菜单2));
menuBar.add(createMenu(菜单3));
menuBar.add(新JSeparator的());
menuBar.add(的新的JButton(SEACH ....));
menuBar.add(新的JTextField(SEACH ....));
menuBar.add(新JComboBox中(新的对象[] {高度,长度,卷}));
menuBar.add(Box.createHorizontalGlue());
menuBar.add(createMenu(关于));
JFrame的帧=新的JFrame(MenuGlueDemo);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(菜单栏);
frame.pack();
frame.setVisible(真);
} 公共JMenu的createMenu(字符串名称){
JMenu的M =新JMenu,(职称);
m.add(+标题,在菜单项#1);
m.add(菜单项#2+称号);
m.add(+标题,在菜单项#3);
如果(title.equals(关于)){
m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
返回米;
} 公共静态无效的主要(字串[] args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){ @覆盖
公共无效的run(){
MenuGlueDemo menuGlueDemo =新MenuGlueDemo();
}
});
}
}
修改
我可以简单但文字输入和在一个容器中某些按钮与一个适当的布局和实现[文本字段...] [B1] [B2]但我想[文本字段[B1] [B2]
块引用>
进口java.awt中的*。
进口java.awt.event.ItemEvent中;
进口java.awt.event.ItemListener;
进口的javax.swing *。公共类MenuGlueDemo { 私人图标errorIcon = UIManager.getIcon(OptionPane.errorIcon);
私人图标infoIcon = UIManager.getIcon(OptionPane.informationIcon);
私人图标warnIcon = UIManager.getIcon(OptionPane.warningIcon); 公共MenuGlueDemo(){
的JPanel面板=新JPanel();
panel.setLayout(新的BorderLayout());
JButton的按钮=新的JButton();
button.setFocusable(假);
//button.setMargin(new插图(0,0,0,0));
button.setContentAreaFilled(假);
button.setIcon((errorIcon));
button.set pressedIcon(warnIcon);
panel.add(按钮,BorderLayout.WEST);
JTextField的文本=新的JTextField(20);
text.setBorder(NULL);
panel.add(文字,BorderLayout.CENTER);
JPanel的buttonsPanel =新JPanel();
buttonsPanel.setOpaque(假);
buttonsPanel.setLayout(新的GridLayout(1,2,2,2));
最后JToggleButton中切换按钮=新JToggleButton中();
toggleButton.setFocusable(假);
toggleButton.setMargin(新插图(0,0,0,0));
toggleButton.setContentAreaFilled(假);
toggleButton.setIcon((errorIcon));
toggleButton.setRolloverIcon((infoIcon));
toggleButton.setSelectedIcon(warnIcon);
toggleButton.set pressedIcon(warnIcon);
toggleButton.addItemListener(新的ItemListener(){ @覆盖
公共无效itemStateChanged(一个ItemEvent E){
如果(toggleButton.isSelected()){
}其他{
}
}
});
buttonsPanel.add(切换按钮);
最后JToggleButton中toggleButton1 =新JToggleButton中();
toggleButton1.setFocusable(假);
toggleButton1.setMargin(新插图(0,0,0,0));
toggleButton1.setContentAreaFilled(假);
toggleButton1.setIcon((errorIcon));
toggleButton1.setRolloverIcon((infoIcon));
toggleButton1.setSelectedIcon(warnIcon);
toggleButton1.set pressedIcon(warnIcon);
toggleButton1.addItemListener(新的ItemListener(){ @覆盖
公共无效itemStateChanged(一个ItemEvent E){
如果(toggleButton1.isSelected()){
}其他{
}
}
});
buttonsPanel.add(toggleButton1);
panel.add(buttonsPanel,BorderLayout.EAST);
panel.setBackground(text.getBackground());
的JMenuBar菜单栏=新的JMenuBar();
menuBar.add(createMenu(菜单1));
menuBar.add(createMenu(菜单2));
menuBar.add(createMenu(菜单3));
menuBar.add(新JSeparator的());
menuBar.add(的新的JButton(SEACH ....));
menuBar.add(面板);
menuBar.add(新JComboBox中(新的对象[] {高度,长度,卷}));
menuBar.add(Box.createHorizontalGlue());
menuBar.add(createMenu(关于));
JFrame的帧=新的JFrame(MenuGlueDemo);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(菜单栏);
frame.pack();
frame.setVisible(真);
} 私人JMenu的createMenu(字符串名称){
JMenu的M =新JMenu,(职称);
m.add(+标题,在菜单项#1);
m.add(菜单项#2+称号);
m.add(+标题,在菜单项#3);
如果(title.equals(关于)){
m.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
}
返回米;
} 公共静态无效的主要(字串[] args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){ @覆盖
公共无效的run(){
MenuGlueDemo menuGlueDemo =新MenuGlueDemo();
}
});
}
}I would like to create a textwidget/component wich looks like the firefox address bar. I mean a Textfield wich allows me to place little Buttons inside the field (e.g. cancel/reload/...)
I tried customizing a JLayeredPane, by creating a custom layout manager which maximizes the Textfield, and places the remainder from right to left. My problem is that this gave painting issues, I would not always see the items I added over the textfield. This might be Jython related, I try suppling
java.lang.Integer(1)
to theJLayeredPane.add
. However the Layers are ordered exactly reverse to what the documentation says.TO cricumvent this I derived my own
JLayeredPane
class and redefinedpaint
to callpaintComponents
which in turn iterates over all components and calls their paint method, starting with the textbox, the rest thereafter.However I don't always get the updates right away, meaning the buttons are hidden/only partly displayed and I can't Interact with the button.
- What do I have to acutally see the update on screen (is it hidden in a buffer?))
- How can I make it so that I can interact with the buttons?
- How can I shorten the Texxtfield, so that the text starts scrolling to the front before I reach the end of the Textfield so that the text does not get hidden by the buttons? I still want the Textfields area to extend under the buttons
edit: the button is only displayed in the right place after i make the window smaller, after that it is also clickable
edit2: I took the freedom to boil the answer down to this, which hides away a lot of that button code/unneccessary 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(); } }); } }
解决方案may be could it be simple by using JMenuBar, with Auto complete ComboBox / JFextField for example
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(); } }); } }
EDIT
I can simply but a text input and some buttons in a container with a proper layout and achieve [Textfield...] [B1] [B2] but I want [Textfield [B1] [B2]]
with proper 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(); } }); } }
这篇关于Java Swing的1.6的TextInput如Firefox吧的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!