【问题标题】:Why won't my JSlider or JLabel appear anywhere on my frame?为什么我的 JSlider 或 JLabel 不会出现在我的框架上的任何位置?
【发布时间】:2019-09-25 21:02:29
【问题描述】:

需要为我的第二节编程课构建一个 GUI。其中一部分包括框架东部的 J 滑块,该滑块应与北部的文本字段同步。但是,起初文本字段不会出现在框架上的任何位置,但最终文本字段及其标签出现了。现在我试图放在框架东侧的任何东西都没有出现。我对Java非常陌生,尤其是swing库,请帮助我理解我做错了什么。

我没有收到任何错误消息,而且我知道我的 build East 函数至少正在运行,因为我使用了 print 语句来测试它。起初框架的北部不会显示任何东西,所以我将 build North 功能向上移动并开始工作。这样做对 build East 功能没有任何作用。我在下面粘贴了我的所有代码。

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

public class GUI1 implements ActionListener
{
    //Create window for GUI
    JFrame window;

    public static void main(String [] args)
    {
        GUI1 g = new GUI1();
    }

    public GUI1()
    {
        //Set name and dimensions of window
        window = new JFrame("Program 2");
        window.setBounds(187, 218, 700, 450);

        buildEast();
        buildNorth();

        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true); //default is invisible window
    }

    public void buildNorth()
    {
        //Creates panel, and adds panel to north of window
        JPanel north_pane = new JPanel();
        window.add(north_pane, BorderLayout.NORTH);

        //Create and add label to JPanel
        JLabel label = new JLabel ("Year");
        north_pane.add(label);

        //Create and add text field to JPanel in north of window
        JTextField tField = new JTextField(5);
        north_pane.add(tField);
    }

    public void buildEast()
    {
        //Create and add panel to east of window
        JPanel east_pane = new JPanel();

        //Add a title for the slider
        JLabel slideLabel = new JLabel ("Change Year");
        east_pane.add(slideLabel);


        final int YEAR_MIN = 1990;
        final int YEAR_MAX = 2019;
        int selectYear = 2000;
        JSlider yearSlide = new JSlider(JSlider.VERTICAL, YEAR_MIN,    YEAR_MAX, selectYear);

        //Setup for slide labels
        yearSlide.setMajorTickSpacing(4);
        yearSlide.setMinorTickSpacing(2);
        yearSlide.setPaintTicks(true);
        yearSlide.setPaintLabels(true);

        east_pane.add(yearSlide);
    }


    public void actionPerformed(ActionEvent e)
    {
        System.out.println("Click");
    }
}

我希望 J 滑块和 J 标签至少出现在我的框架上。没有错误消息。

【问题讨论】:

  • 我没有看到任何将east_pane 添加到window 的代码。或任何家长。
  • 将此作为buildEast的第二条语句添加:window.add(east_pane, BorderLayout.EAST);

标签: java swing


【解决方案1】:

在 Swing 中,您必须将希望显示的任何元素附加到 JFrame(通常通过中间 JPanel 等),然后您必须将其设置为可见。正如 cmets 中所指出的,您永远不会在代码中将 east_pane 添加到 JFrame。

有两种方法可以解决这个问题:

快速简便的选择是添加该行

window.add(east_pane, BorderLayout.EAST); 

在east_pane声明之后就行了。

然而,更好的选择是让您的 buildEast() 和 buildNorth() 方法返回 JPanel 对象,然后像这样将它们集成到 GUI1 方法内的 JFrame 中(请注意,我们现在还可以更狭隘):

public GUI1()
{
    //Set name and dimensions of window
    JFrame window = new JFrame("Program 2");
    window.setBounds(187, 218, 700, 450);

    window.add(buildEast(), BorderLayout.EAST);
    window.add(buildNorth(), BorderLayout.NORTH);

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true); //default is invisible window
}
public JPanel buildEast()
{
    //Create and add panel to east of window
    JPanel east_pane = new JPanel();
    //Add a title for the slider
    JLabel slideLabel = new JLabel ("Change Year");
    east_pane.add(slideLabel);


    final int YEAR_MIN = 1990;
    final int YEAR_MAX = 2019;
    int selectYear = 2000;
    JSlider yearSlide = new JSlider(JSlider.VERTICAL, YEAR_MIN, YEAR_MAX, selectYear);

    //Setup for slide labels
    yearSlide.setMajorTickSpacing(4);
    yearSlide.setMinorTickSpacing(2);
    yearSlide.setPaintTicks(true);
    yearSlide.setPaintLabels(true);

    east_pane.add(yearSlide);
    return east_pane;
}

走这条路会让你的 UI 在规模变大时更容易处理。

Swing 以这种方式工作的原因(进而,您没有收到任何错误但能够使用这些打印语句的原因)是 Swing 允许您动态地动态交换 UI 元素。虽然这可能超出了您的任务范围,但请考虑使用选项卡式应用程序。每次隐藏选项卡时都可能不希望(也可能不希望)销毁选项卡,只需要稍后重新创建它(因为这需要时间,它可能包含数据或处理逻辑等)。而且,显然,您不希望它一直可见。那么答案就是在您想要这样做之前不显示该选项卡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-04
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多