Java swing 1.6 像firefox bar一样的文本输入

2024-04-20

我想创建一个看起来像 Firefox 地址栏的文本小部件/组件。我的意思是一个文本字段,它允许我在字段内放置小按钮(例如取消/重新加载/...)

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

为了规避这个问题,我派生了自己的JLayeredPane类并重新定义paint打电话paintComponents依次迭代所有组件并调用其绘制方法,从文本框开始,然后调用其余组件。

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

  1. 我必须做什么才能在屏幕上实际看到更新(它是否隐藏在缓冲区中?))
  2. 我怎样才能做到与按钮交互?
  3. 如何缩短文本字段,以便文本在到达文本字段末尾之前开始滚动到前面,这样文本就不会被按钮隐藏?我仍然希望文本字段区域在按钮下方扩展

edit:只有在我将窗口缩小后,按钮才会显示在正确的位置,之后它也可以点击

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 http://docs.oracle.com/javase/7/docs/api/javax/swing/JMenuBar.html, with 自动完成 ComboBox / JFextField http://www.java2s.com/Code/Java/Swing-Components/AutocompleteComboBox.htm例如

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

我可以简单地在具有正确布局的容器中输入文本和一些按钮并实现 [Textfield...] [B1] [B2] 但我想要 [Textfield [B1] [B2]]

与适当的布局管理器 http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

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();
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java swing 1.6 像firefox bar一样的文本输入 的相关文章

随机推荐

  • gnu c++ 中是否有 __if_exists 的等效项?

    if exists 是微软特定的关键字 用于在编译时测试标识符的存在 msdn if exists http msdn microsoft com en us library x7wy9xh3 aspx 它在 伪造 模板专业化方面非常方便
  • 在简单存储过程中正确使用 SCOPE_IDENTITY 函数

    我想简单地将一些信息从简单的客户端发送到日志文件 然后使用创建的身份进行进一步处理 是下面的使用SCOPE IDENTITY 正确的 CREATE PROCEDURE dbo LogSearch userName VARCHAR 50 da
  • 让 JAWS 忽略 html 元素

    我目前正在尝试使我的应用程序对那些视力有困难的人来说更加用户友好 正如人们所料 我正在使用 JAWS 来测试我的应用程序 我遇到的大多数问题都相对容易解决 但我被一个问题难住了 在我的应用程序中 我通过 iframe 注入了广告 我希望 J
  • 我想向我的销售点的用户授予特权,但我不知道如何做,有什么建议吗?

    我有一个问题 我有一个用netBeans制作的销售点系统 2个用户可以在我的系统中注册 管理员 和 供应商 系统中有几个模块 包括 Inventario 模块允许您在数据库中输入 修改 删除和搜索文章 问题是我希望只有管理员有权限进入该模块
  • 就像实体框架中的运算符一样? [复制]

    这个问题在这里已经有答案了 我们正在尝试在实体框架中为具有字符串字段的实体实现 LIKE 运算符 但它似乎不受支持 还有其他人尝试过做这样的事情吗 This 博客文章 http th2tran blogspot com 2009 06 li
  • 在 postgresql、heroku、Rails 4 上设计主键错误[重复]

    这个问题在这里已经有答案了 这真的很奇怪 我试图通过命令行创建一个新用户 但收到此错误 User create email gt email protected cdn cgi l email protection password gt
  • java.library.path 中没有 opencv_java300 [重复]

    这个问题在这里已经有答案了 提前致谢 我有一个项目使用opencv 300 jar作为外部库 我在 eclipse 中尝试过这个网豆 当我从 IDE 本身运行我的项目时 这两种方法都可以成功运行 我希望我的项目将其导出为可运行 或可执行 j
  • Spring Data JPA – @Query – 不支持 DML 操作

    我在用 春季 4 3 9 发布 休眠 3 6 3 最终版 Spring Data JPA 1 6 4 RELEASE 用于公开 Rest 服务 我在用 Transactional and Modifying对于更新查询之一 尽管如此 我还是
  • Google 同意模式适用于 UA,但不适用于 GA4

    我无法使用 GA4 在没有 cookie 的情况下进行跟踪 我有 UA 和 GA4 媒体资源 我正在使用 gtag 同时跟踪它们 window dataLayer window dataLayer function gtag dataLay
  • 如何在make后运行.o文件

    我一直在尝试运行一个 C 程序https github com rinon Simple Homomorphic Encryption https github com rinon Simple Homomorphic Encryption
  • 从 AWS EC2 MySQL 数据库迁移到 Azure MySQL 数据库导致性能非常差且缓慢

    我们有一个非常小的 150MB 的 MySQL 数据库 它在 AWS t2 large 数据库作为自托管的情况下运行得非常快 硬件规格 Azure 2 个 vCPU 10 GB 内存 AWS 2 个 vCPU 8 GB 内存 不过 该公司决
  • 拉取部署、github 操作和 ssh 密钥

    比方说 我想使用 GitHub 操作和拉取策略来设置部署流程 所以我有一个 Ubuntu 服务器 我复制服务器的公共 ssh 密钥 将其添加到我的 GitHub 帐户 然后我可以从 Ubuntu 服务器克隆 构建并运行应用程序 那太好了 但
  • KeeperErrorCode = /admin/preferred_replica_election 的 NoNode

    当我启动kafka时 zookeeper发生错误 INFO Got user level KeeperException when processing sessionid 0x156028651c00001 type delete cxi
  • Xcode `Archive` 功能是否自动使用 `Release` 构建配置?

    我的标准工作流程 当将应用程序发布到 App Store 时 是按Product gt Archive从 Xcode 的菜单栏 我意识到我从来没有改变过 XcodeBuild Configuration在我的构建方案中 我已将其设置为Deb
  • 如何在 Swift 中实现 UIPageControl

    好吧 我在这里苦苦挣扎 无法找到有效的解决方案 我一直在自学 Swift 没有 Objective C 经验 我知道 我知道 在我的应用程序中 我有我的主要UIViewController 一个透明但从屏幕底部滑入的子视图 然后滑动子视图的
  • UISlider自定义图像和拇指高度?

    我正在创建 或尝试 自定义 UISlider 外观 仍然水平但更高 我有两个问题 1 这是我用来将图像放到滑块上的代码 UIImage minImage UIImage imageNamed sliderMin png UIImage ma
  • 如何将 Admin SDK api 添加到 android 项目

    我目前正在开发一个需要管理员和普通用户的 Android 应用程序 举例来说 管理员可以管理普通用户 例如删除 修改其内容 根据我的研究 firebase提供的Admin SDK API确实可以解决这个问题 但根据他们的文档 Admin S
  • 带 slimscroll 的水平滚动条

    我使用 slimscroll 来满足我的滚动需求 效果很好 现在我需要水平滚动 快速的谷歌搜索给了我一些 github 源代码中的参考结果和一些问题 这些问题表明已经添加了水平滚动支持 但我找不到示例 我查看了 javascript 文件
  • 流星构建中的箭头功能导致 Heroku 部署崩溃

    我在heroku上部署了一个使用meteor的js应用程序 构建在 localhost 上运行 但在 heroku 服务器上失败 我检查了日志并发现了这一点 js 312 12 2017 03 18T03 29 07 070711 00 0
  • Java swing 1.6 像firefox bar一样的文本输入

    我想创建一个看起来像 Firefox 地址栏的文本小部件 组件 我的意思是一个文本字段 它允许我在字段内放置小按钮 例如取消 重新加载 我尝试通过创建自定义布局管理器来自定义 JLayeredPane 该布局管理器最大化文本字段 并将其余部