用按钮显示/隐藏 JLabel?

rho*_*ell 1 java swing

目前该代码仅隐藏 JLabel。我不确定为什么当我再次单击按钮时它不可见。希望这是一个简单的修复

        contentPane.add(btnSwap);   
    btnHide.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            lblHello.setVisible(false);
        }
    }); 
    contentPane.add(btnHide);
    btnHide.setBounds(185, 199, 89, 23);
    lblHello.setVisible(true);

}
Run Code Online (Sandbox Code Playgroud)

Hov*_*els 5

我不确定为什么当我再次单击按钮时它不可见。

为什么要这样做,因为 ActionListener 所做的(按下按钮时调用的代码)是不断地将标签设置为不可见?

一种解决方案是简单地切换其可见性:

lblHello.setVisible(!lblHello.isVisible());
Run Code Online (Sandbox Code Playgroud)

请注意,为了安全起见,最好在进行此类更改后重新验证并重新绘制容器,因此:

btnHide.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        lblHello.setVisible(!lblHello.isVisible());
        revalidate();
        repaint();
    }
}); 
Run Code Online (Sandbox Code Playgroud)

因为这将消除 GUI 中的“脏”像素,这些像素可能因添加尤其是删除可见组件而出现。


关于这句话:

btnHide.setBounds(185, 199, 89, 23);
Run Code Online (Sandbox Code Playgroud)

这表明您正在使用带有setBounds(...). 虽然这在新手 Swing 程序员看来通常是创建复杂 GUI 的最佳方式,但它以后会再次困扰他们,因为这意味着 GUI 在一个平台和一个平台上看起来都不错,如果以后你想增强或改进 GUI,它只能以很大的难度和错误的风险来完成。更好的是学习和使用布局管理器。


另一个建议:

如果您希望在按下按钮时更改 GUI 的外观,那么还可以查看 CardLayout(请查看CardLayout 教程),因为这可以是一种干净且轻松地交换视图的方法


还有一个更好的建议:

由于 JLabel 仅显示其文本或其图标或两者,因此使其“不可见”的最佳方法是删除其文本及其图标,如下面的 Andrew Thompson 所述:

// get rid of its text
lblHello.setText("");

// and if needed
lblHello.setIcon(null);
Run Code Online (Sandbox Code Playgroud)

这不适用于诸如 JTextFields 和 JTextAreas 之类的文本组件或其他比 JLabel 具有更多“重量”的组件,包括几乎所有其他用户交互组件。