【问题标题】:JButton appears after selection of value in JList在 JList 中选择值后出现 JButton
【发布时间】:2016-06-05 09:32:03
【问题描述】:

我有一个包含一些元素的 JList,我希望只有当用户在列表中选择一个值时才会出现一个 JButton。这是我尝试过的:

public void itemStateChanged(ItemEvent event) {
        int choice = avDevBox.getSelectedIndex();
        if (choice = 0) {
            list = new JList(listModel1);
            list.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent ev1) {
                    if (!ev1.getValueIsAdjusting()) {                       
                            String outputext = list.getSelectedValue().toString();
                            itemDetails.setText(outputext);
                    }
                }

            });                     
            add(list);
            add(itemDetails);
            add(but1);
}

有什么办法吗?

提前致谢。

【问题讨论】:

    标签: java swing user-interface


    【解决方案1】:

    您可以在您的 GUI 上已经有一个 JButton,但通过 myButton.setVisible(false) 使其不可见。然后在您的 JList 的 ListSelectionListener 中调用 myButton.setVisible(true)。然后,您需要在包含现在可见的 JButton 的容器(通常是 JPanel)上调用 revalidate()repaint()

    请注意,对于未来的问题,您将希望创建和发布更多相关代码,最好是 Minimal, Complete, and Verifiable Example Program,因为这将使我们能够了解您当前的代码为何无法正常工作,并有助于我们自信地回答问题。

    以 MCVE 为例:

    import java.awt.Dimension;
    import java.awt.event.ActionEvent;
    import java.awt.event.KeyEvent;
    
    import javax.swing.*;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    
    @SuppressWarnings("serial")
    public class McveExample extends JPanel {
        private static final String[] DATA = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
        private static final int PREF_W = 400;
        private static final int PREF_H = 250;
        private JList<String> list = new JList<>(DATA);
        private JButton myButton = new JButton();
    
        public McveExample() {
    
            myButton.setVisible(false);  // **** make button invisible
    
            list.setVisibleRowCount(4);
            list.addListSelectionListener(new ListListener()); // listener that does the dirty work
    
            JScrollPane scrollPane = new JScrollPane(list);
    
            // add a JButton that resets myButton back to being invisible
            add(new JButton(new ResetAction("Reset", KeyEvent.VK_R)));
            add(scrollPane);
            add(myButton);
        }
    
        // make sure things are big enough
        @Override
        public Dimension getPreferredSize() {
            Dimension superSz = super.getPreferredSize();
            if (isPreferredSizeSet()) {
                return superSz;
            }
            int prefW = Math.max(superSz.width, PREF_W);
            int prefH = Math.max(superSz.height, PREF_H);
            return new Dimension(prefW, prefH);
        }
    
        private class ResetAction extends AbstractAction {
            public ResetAction(String name, int mnemonic) {
                super(name);
                putValue(MNEMONIC_KEY, mnemonic);
            }
    
            @Override
            public void actionPerformed(ActionEvent e) {
                list.clearSelection();
                myButton.setVisible(false);
                McveExample.this.revalidate();
                McveExample.this.repaint();
            }
        }
    
        private class ListListener implements ListSelectionListener {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    JList<String> lst = (JList<String>) e.getSource();
                    String selection = lst.getSelectedValue();
                    if (selection != null) {
                        myButton.setText(selection);
                        myButton.setVisible(true);
                        McveExample.this.revalidate();
                        McveExample.this.repaint();
                    }
                }
            }
        }
    
        private static void createAndShowGui() {
            McveExample mainPanel = new McveExample();
    
            JFrame frame = new JFrame("McveExample");
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            frame.getContentPane().add(mainPanel);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> createAndShowGui());
        }
    }
    

    【讨论】:

    • @D.Jones:请参阅编辑以查看 MCVE 示例。
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2013-11-01
    • 2010-10-13
    • 2012-08-02
    • 2016-10-05
    • 2011-10-12
    • 2014-03-05
    • 1970-01-01
    相关资源
    最近更新 更多