为什么我的JSlider或JLabel不会出现在框架的任何位置?

时间:2019-09-16 18:47:15

标签: java swing

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

我没有收到任何错误消息,并且我知道我的构建East函数至少正在运行,因为我已经使用print语句进行了测试。刚开始时,框架的最北端什么都没有显示,因此我将构建北端功能进一步移到了上面并开始工作。这样做对构建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标签至少出现在我的框架上。没有错误消息。

1 个答案:

答案 0 :(得分:0)

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

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

快速简便的选择是添加行

window.add(east_pane, BorderLayout.EAST); 

声明east_pane之后的行。

但是,更好的选择是使您的buildEast()和buildNorth()方法返回JPanel对象,然后像这样将它们集成到GUI1方法内的JFrame中(请注意,我们现在还可以扩大window对象的作用域狭窄地):

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元素。尽管这可能超出您的分配范围,但请考虑使用选项卡式应用程序。每次(隐藏)一个选项卡时都可能不希望(也可能不希望)破坏该选项卡,而只是稍后需要重新创建它(因为这需要时间,它可能包含数据或处理逻辑等)。而且,显然,您不希望它始终可见。答案就是根本不显示该选项卡。