【问题标题】:JButton only appears after i hover over itJButton 仅在我将鼠标悬停在它上面后才会出现
【发布时间】:2020-06-29 17:38:56
【问题描述】:

第二个按钮在我将鼠标悬停在它上面之前是不可见的。

我知道 JPanel 已经有关于这个问题的答案,但它们似乎对我不起作用。

我有以下代码:

主类

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Window w = new Window();
        });
    }
}

我的自定义窗口

public class Window implements ActionListener {

    JFrame f;
    JButton b1, b2;
    JRootPane jRootPane;

    public Window() {
        f = new JFrame("Ceaser Verschluesselung");
        f.setPreferredSize(new Dimension(480, 150));
        f.setResizable(false);
        f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        f.setLocation(720, 300);
        f.setLayout(null);
        jRootPane = f.getRootPane();

        b1 = new JButton("Verschlüsseln");
        b2 = new JButton("Entschlüsseln");
        b1.setSize(new Dimension(220, 100));
        b1.setLocation(7, 5);
        b1.setFont(new Font("1", Font.BOLD, 25));
        b1.addActionListener(this);
        b2.setSize(new Dimension(220, 100));
        b2.setLocation(237, 5);
        b2.setFont(new Font("1", Font.BOLD, 25));
        b2.addActionListener(this);
        jRootPane.add(b1);
        jRootPane.add(b2);

        f.pack();
        f.setVisible(true);
    }

    public void setVisibility(boolean b) {
        f.setVisible(b);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Verschlüsseln")) {
            new Encoder(this);
        } else if (e.getActionCommand().equals("Entschlüsseln")) {
            new Decoder();
        }
    }
}

我之前在其他项目上遇到过这个问题,但运行 Window 的 SwingUtilities.invokeLater() 修复了它。在与 JPanels 的另一个线程上,我发现按钮折叠时会消失,但我尝试使用更窄的按钮,但根本没有改变任何东西。

我没有添加编码器和解码器类,我认为没有必要,直到有人证明我错了:D

【问题讨论】:

    标签: java swing jframe window awt


    【解决方案1】:

    阅读How to Use RootPanes。您不应将组件添加到RootPane。相反,您应该将它们添加到内容窗格中:

    Container contentPane;
    //....
    contentPane = f.getContentPane();
    

    全班:

    public class Window implements ActionListener {
    
        JFrame f;
        JButton b1, b2;
        Container contentPane;
    
        public Window() {
            f = new JFrame("Ceaser Verschluesselung");
            f.setPreferredSize(new Dimension(480, 150));
            f.setResizable(false);
            f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            f.setLocation(720, 300);
            f.setLayout(null);
            contentPane = f.getContentPane();
    
            b1 = new JButton("Verschlüsseln");
            b2 = new JButton("Entschlüsseln");
            b1.setSize(new Dimension(220, 100));
            b1.setLocation(7, 5);
            b1.setFont(new Font("1", Font.BOLD, 25));
            b1.addActionListener(this);
            b2.setSize(new Dimension(220, 100));
            b2.setLocation(237, 5);
            b2.setFont(new Font("1", Font.BOLD, 25));
            b2.addActionListener(this);
            contentPane.add(b1);
            contentPane.add(b2);
    
            f.pack();
            f.setVisible(true);
        }
    
        public void setVisibility(boolean b) {
            f.setVisible(b);
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Verschlüsseln")) {
    
            } else if (e.getActionCommand().equals("Entschlüsseln")) {
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(() -> new Window());
        }
    }
    

    另外,使用setLayout(null) 是不好的(坏的)做法。请改用layout managers。这将使您的生活更轻松,而且您的 GUI 将更加用户友好,因为它支持调整大小。

    【讨论】:

    • 我之前尝试过使用内容窗格,但没有成功。今天我再次对其进行了测试,它使第二个按钮可见,但填充了完整的 UI。我使用布局管理器 null 只是为了测试目的,看看它是否适用于它......但它根本没有改变任何东西。 :(
    • 好的,它只适用于布局管理器,即使它为空。我想我只尝试使用 ContentPane 而不设置任何布局管理器。我被告知要使用其他布局然后为空,但这个窗口根本不应该是可调整的,并且只包含两个按钮。
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多