简体   繁体   English

摆动按钮在执行之前不可见

[英]Swing Button Invisible until actionPerformed

Is it possible to create a button that won't be seen until the user clicks another button? 是否可以创建一个在用户单击另一个按钮之前不会显示的按钮?

My goal is for the button to be invisible by default rather than when its clicked on. 我的目标是默认情况下而不是单击按钮时不显示该按钮。 Then become visible when another action is performed. 然后在执行其他操作时变得可见。 The code below is my original attempt at creating this. 下面的代码是我最初创建此代码的尝试。

public void but_roll1ActionPerformed(java.awt.event.ActionEvent evt) 
{
    if (!bal_but.isEnabled() && !gamble_but.isEnabled()) {
        but_roll1.setVisible(true);
        but_roll1.setEnabled(true);         
        d1 = diceRoll();
        die1_display.setText(String.valueOf(d1));  
        but_roll1.setEnabled(false);
    } else {
        but_roll1.setVisible(false);
    }
}  

Two better strategies: 两种更好的策略:

  1. Put the button in a CardLayout with a second blank panel till needed. 直到需要时,将按钮放入带有第二个空白面板的CardLayout
  2. Make the button disabled until the first button is clicked. 在单击第一个按钮之前,请禁用该按钮。

I prefer the 2nd as the 'path of least surprise' for the user. 我更喜欢将第二个作为用户的“最小惊喜之路”。 YMMV. YMMV。

Initial view 初步观点

在此处输入图片说明

View after 'effect' button actioned “效果”按钮生效后查看

在此处输入图片说明

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class ButtonNotUsableTillAction {

    private JComponent ui = null;

    ButtonNotUsableTillAction() {
        initUI();
    }

    public void initUI() {
        if (ui!=null) return;

        ui = new JPanel(new GridLayout(1, 0, 4, 4));
        ui.setBorder(new EmptyBorder(4,4,4,4));

        // first demo, using card layout
        JPanel cardDemoPanel = new JPanel(new GridLayout(1, 0, 2, 2));
        cardDemoPanel.setBorder(new TitledBorder("Card Layout"));
        ui.add(cardDemoPanel);

        JButton actionCardButton = new JButton("Action");
        cardDemoPanel.add(actionCardButton);

        CardLayout cardLayout = new CardLayout();
        JPanel cardLayoutPanel = new JPanel(cardLayout);
        cardDemoPanel.add(cardLayoutPanel);
        cardLayoutPanel.add(new JPanel(), "panel");
        cardLayoutPanel.add(new JButton("Effect"), "button");
        cardLayout.show(cardLayoutPanel, "panel");

        ActionListener flipCardListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                cardLayout.show(cardLayoutPanel, "button");
            }
        };
        actionCardButton.addActionListener(flipCardListener);

        // first demo, using disabled / enabled
        JPanel enabledDemoPanel = new JPanel(new GridLayout(1, 0, 2, 2));
        enabledDemoPanel.setBorder(new TitledBorder("Enabled"));
        ui.add(enabledDemoPanel);
        JButton actionEnabledButton = new JButton("Action");
        enabledDemoPanel.add(actionEnabledButton);
        JButton effectButton = new JButton("Effect");
        enabledDemoPanel.add(effectButton);
        effectButton.setEnabled(false);
        ActionListener enableComponentListener = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                effectButton.setEnabled(true);
            }
        };
        actionEnabledButton.addActionListener(enableComponentListener);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ButtonNotUsableTillAction o = new ButtonNotUsableTillAction();

                JFrame f = new JFrame(o.getClass().getSimpleName());
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

如@markspace所述,您需要在将按钮设置为可见后重新验证按钮的容器:

but_roll1.getParent().revalidate();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM