如何在 JTextField 中放置一个 JButton(Java)?

3
我希望在JTextField中放置一个带有文件夹图标的JButton,就像在JTextField的最右侧一样,这样当点击按钮时,按钮将打开一个JFileChooser,当选择文件后,文件路径将出现在JTextField中。
我已经编写了以下代码,但什么也没有显示出来。
public class TextFieldChooser extends JTextField {

    public ImageIcon folderIcon;
    public JButton btnFolder;

    public TextFieldChooser(int columns) {
        super(columns);
        btnFolder = new JButton();
        folderIcon = new ImageIcon(getClass().getResource("/resources/folder_find.png"));
        btnFolder.setIcon(folderIcon);
        this.add(btnFolder);

    }
}

推崇对象组合而非类继承。——Erich Gamma http://www.artima.com/lejava/articles/designprinciples4.html - trashgod
5个回答

6
您可能会发现组件边框很有用。它使用Border API允许您在文本字段中显示一个按钮。

除了新颖的API之外,这也是对传统方法进行微调的有用阐述。 - trashgod
太好了,这很棒。我最初在JPanel上设置的边框在Mac和Windows上运行良好,但在Linux上失败了。也许这个会更好用。 - Pyrite

4
您不应该在文本框中放置按钮,需要将您的意图分解为几个组件-实际上是三个。首先,您需要一个父容器,或者说是包含文本字段和按钮的东西;使用JPanel即可。然后,您需要真正的组件,也就是那些实际上有用的组件。这些组件是JTextField和JButton - 将它们添加到JPanel中。为了将它们添加并使它们以您想要的方式显示(其中包含按钮角落),您需要为JPanel指定布局。此布局将定义添加的组件在JPanel内部的位置(视觉上)。现在,您已经将这些内容添加到JPanel中,可以仅使用JPanel而不是考虑包含的JTextField和JButton。

2
看一下这个截图,这个程序是用Delphi编写的,我正在用Java重新制作它。显然Delphi有一个满足这个需求的组件。为什么Java没有呢?http://screencast.com/t/OTNhOTA2ZGY - Pyrite
你可以在文本字段中放置一个按钮;只是渲染正确有些棘手。 - trashgod
实际上,您可以将边框设置为0,然后将两个元素放在一起,使其看起来像一个元素在另一个元素内部。 - TheLQ
@TheLQ:没错。JPanel 明确地被设计为“通用轻量级容器”。 - trashgod

4

在Shakedown提出的基础上,我认为你可以相对容易地实现所需的效果。你需要创建一个包含文本区域和按钮的JPanel。接下来,将文本区域设置为不绘制任何边框,并给JPanel添加斜面边框。现在它看起来就像按钮在文本区域内部一样。可能需要进行一些微调,但应该可以实现。


好的,这很有效。思路不错,如果这就是Shakedown最初的意图,那么也要给他一个加1。 - Pyrite
这里是我新组件面板的屏幕截图。http://screencast.com/t/MDdiMTM0MTA - Pyrite

2
由于Pyrite还没有发布他的最终解决方案,所以我在这里提供我的解决方案:
my_button = new JButton("x");
JFormattedTextField my_textfield = new JFormattedTextField("Nr.");
my_textfield.setBorder(javax.swing.BorderFactory.createEmptyBorder());

JPanel textfield_with_button = new JPanel(new FlowLayout(FlowLayout.CENTER, 0, 0));
Border lowered_bevelborder = BorderFactory.createLoweredBevelBorder();
textfield_with_button.setBorder(lowered_bevelborder);

textfield_with_button.add(my_textfield);
textfield_with_button.add(my_button);

enter image description here


0

我想你可能已经得到了答案,但是对于其他想要轻松完成此操作的人来说,因为我认为其他答案有点太复杂了。 所以,当您创建JTextField时,也要创建JButton。看看代码:

JButton button = new JButton();
button.setBounds(50, 5, 50, 25);
button.setBackground(Color.black);
JTextField textField = new JTextField();
textField.setBounds(20, 60, 100, 35);
textField.setBackground(Color.white);
textField.add(button);

这很简单,我在按钮上使用了setBounds(),因为我可以将它放置在任何位置,至于textField,您也可以使用框架/面板布局,但这只是为了演示它的工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接