【问题标题】:GUI won't open when button pressed (Java)按下按钮时 GUI 不会打开 (Java)
【发布时间】:2015-06-06 17:40:14
【问题描述】:

我试图通过按一个按钮从我的主 GUI 打开一个 GUI。当按钮被按下时,执行:

WorkloadFactor wf = new WorkloadFactor();
wf.setVisible(true);

这不会打开 WorkloadFactor GUI。我对此感到困惑,因为我有其他 GUI 以这种方式打开而没有问题。

WorkloadFactor 类在我自己运行时工作正常,但在我的主 GUI 调用它时不会打开。下面是我的类,没有导入和东西:

public class WorkloadFactor extends JPanel {


public WorkloadFactor() {
setLayout(new BorderLayout());

JTabbedPane tabbedPane = new JTabbedPane();


String[] tabnames = { "Zero", "One", "Two", "Three", "Four" };

for (int i = 0; i < tabnames.length; i++) { 
  tabbedPane.addTab(tabnames[i], createPane(tabnames[i]));


}
tabbedPane.setSelectedIndex(0);
JButton submit = new JButton("Submit All");
submit.setForeground(Color.RED);
add(tabbedPane, BorderLayout.CENTER);
add(submit, BorderLayout.SOUTH);

}

public JPanel createPane(final String t) {

    JPanel contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    //setContentPane(contentPane); I think this might be it?
    contentPane.setLayout(null);
    setBounds(100, 100, 531, 347);
//***** all the components I am including then add them like so
//******contentPane.add(checkbox1);
//****** contentpane.add(label1); 

    return contentPane;
}

public static void main(String[] args) {
JFrame frame = new JFrame("Set Workload Factor Information");

frame.getContentPane().add(new WorkloadFactor());
frame.setBounds(100, 100, 531, 347);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

}

我尝试过以多种方式安排事情,将所有内容都放在构造函数中并进行其他更改,但似乎找不到在其他地方实例化此 WorkloadFactor 类并将其设置为可见不起作用的原因。

是否与 setContentPane(contentPane) vs contentPane.add(xxxx) 并返回有关?

感谢您的阅读!

【问题讨论】:

  • 为什么要为 contentPane 使用 null 布局?
  • @chancea 的评论同上——如果可能的话,你应该避免使用null 布局。使用它们会将您的程序标记为可能的“新手”程序,因为大多数创建了许多 Swing GUI 的人都知道创建和维护使用布局管理器的 GUI 会更容易。此外,您没有向我们展示最重要的代码——您的按钮应该在哪里显示此类。仅将其设置为可见还远远不够——您必须将其放入最终由顶级窗口(如 JFrame)保存的容器中。
  • @ Hovercraft Full Of Eels 是的,我是新手。我能够使用以下行打开有问题的 GUI:WorkloadFactor.main(null);从那里,一个 JFrame 被创建并在 WorkloadFactor 的主要方法中设置为可见。你能简单解释一下布局管理器是做什么的吗?感谢您的多次回复。

标签: java swing user-interface


【解决方案1】:
WorkloadFactor wf = new WorkloadFactor();
wf.setVisible(true);

坦率地说,这不会显示任何内容。请理解,WorkloadFactor 扩展了 JPanel,并且像所有非顶级组件一样,必须将其放入最终由顶级窗口保存的容器中才能显示。看看你是如何在你的 main 方法中显示它的——你首先把它放到一个 JFrame 中,然后显示那个 JFrame。如果你想在按钮按下时显示它,你必须做同样的事情——你需要将它放入 JFrame 或 JDialog 或 JOptionPane 持有的 JPanel 或其他容器中。

【讨论】:

    【解决方案2】:

    确保您已在主 GUI 上正确注册按钮,该按钮将 WorkLoadFactor GUI 打开到操作侦听器。

    由于您没有包含主 GUI 中的代码,我无法确认这是问题所在。然而,这是一个经常被忽视的问题。

    以下是 Java 文档教程中的一些建议:

    “问题:我正在尝试处理来自组件的某些事件,但该组件没有生成它应该生成的事件。

    首先,确保您注册了正确类型的侦听器来检测事件。看看另一种侦听器是否可以检测到您需要的事件类型。

    确保您在正确的对象上注册了监听器。

    您是否正确实现了事件处理程序?例如,如果您扩展了一个适配器类,那么请确保您使用了正确的方法签名。确保每个事件处理方法都是 public void、名称拼写正确且参数类型正确。”

    source: Solving Common Event-Handling Problems

    【讨论】:

      【解决方案3】:

      制作一个 JFrame 并在其中添加一个 JButton,而不是在按钮中添加动作侦听器并在其中添加此代码,如下所示:

      这段代码创建了一个带有按钮的框架,当按下按钮时,新窗口被打开。

      public class Example extends JFrame {
      
      public Example() {
      super("Title");
      setLayout(new FlowLayout());
      
      JButton b = new JButton("Open new Frame");
      b.addActionListener(new ActionListener() {
      
          public void actionPerformed(ActionEvent arg0) {
      
              newWindow nw = new newWindow();
      
          }
      });
      
      add(b);
      
       }  
      }
      

      新窗口代码:

      public class newWindow extends JFrame {
      
      newWindow() {
      super("title");
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setSize(400,400);
      setVisible(true);
       }  
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-05
        • 1970-01-01
        • 2021-11-22
        • 2014-01-27
        • 1970-01-01
        • 2019-03-01
        • 2018-03-04
        • 1970-01-01
        相关资源
        最近更新 更多