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