【问题标题】:Button and textfield don't show up in Java按钮和文本字段不显示在 Java 中
【发布时间】:2013-01-18 07:02:16
【问题描述】:

对于学校,我必须制作一个 JFrame,并在其中一个按钮和两个文本字段。无论您在 Textfield 1 中放置什么,都必须在按下按钮时进入 textfield 2。我得到了代码,当我运行程序时我应该看到文本字段和按钮。无论出于何种原因,它都没有。

我来了这么远:

package helloworld;

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

    public class HelloWorld extends JFrame {

        public static void main(String[] args) {

             JFrame frame = new HelloWorld();
             frame.setSize(400, 400);
             frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             frame.setTitle("Hello World Button App");

             JPanel panel = new JPanel();
             frame.setContentPane(panel);
             fram.setVisible(true);
         }
       }

       class panel extends JPanel {

          public JButton btn1 = new JButton("Klick!");
          public JTextField txt1 = new JTextField(10);
          public JTextField txt2 = new JTextField(10);

          public panel() {
               add(btn1);
               add(txt1);
               add(txt2);
            }
          }

我还不能发布图片,但我会提供图片链接here

如果这个问题已经存在,我很抱歉,但我找不到类似的问题。 我是编程新手,所以当我忘记了什么或写错了什么时,请不要对我大喊大叫!

【问题讨论】:

  • fram.setVisible(true);应该是 frame.setVisible..
  • 不要扩展JFrame。我还没有看到这样做有意义的案例。只需创建一个实例并将 GUI 添加到其中。
  • @AndrewThompson 我认为定义我们的 owm 组件时有意义吗?可能是!
  • @joeyrohan 挑战。向我展示一个令人信服的 SSCCE,其中实现效果的唯一方法是扩展 JFrame。如果我可以重现显示的效果(而且它不仅仅是一个“哑”效果),没有扩展框架,答案将被视为无效。
  • @AndrewThompson 肯定可以重现相同的效果。而且我也知道扩展JFrame 是一件愚蠢的事情。但是假设如果创建多个实例,例如新的ClassExtendsJFrame().setVisible(true); // 第一个窗口@ 987654327@会不会很简单?

标签: java swing netbeans jpanel


【解决方案1】:

您声明了一个名为panel 的类,您没有在任何地方使用它。请替换 bwlow 行:

JPanel panel = new JPanel();

与:

SomePanel panel = new SomePanel();

然后,您的班级 panel 变为 SomePanel 以遵循正确的班级命名。

一些可以帮助你的想法:

  • 按照 Java 风格命名您的类
  • 不要使用公共字段
  • 在您的面板上设置布局。这次它对您有用,因为默认值为 FlowLayout

【讨论】:

  • 那么JPanel应该是变量?
  • JPanel 是 Java API 中的一个类。
【解决方案2】:

那是因为你的班级名称是 panel 而不是 JPanel

修改这个:

panel panel = new panel();
frame.setContentPane(panel);
frame.setVisible(true);

您应该尝试为您的类使用不那么容易混淆的名称,并尝试使用大写来声明它们。

例子:

Class Panel extends JPanel {}

对象:

Panel panel = new Panel()

在这里你可以清楚地看到哪个是类名,哪个是该类的对象(该类的实例)。

【讨论】:

  • 如果只是添加组件,Op 真的不应该扩展 JPanel
  • @joeyrohan 我建议你刷新一下你的 OO 基础知识 :)
  • 当我尝试这个并尝试运行它时,它给了我一个例外:Exception in thread "Main" Java.awt.IllegalComponentStateException: contentPane cannot be set to null. 我已经重命名了所有变量,并且在 Netbeans 本身中,它只有在我运行程序时才给出任何警告。跨度>
  • @joeyrohan 您查阅了哪些面向对象的基本文本?如果它不处理......基础知识(关于什么/如何以及何时/不扩展),请查看另一个:-)
  • @kleopatra 我从Oracle "The idea of inheritance is simple but powerful: When you want to create a new class and there is already a class that includes some of the code that you want, you can derive your new class from the existing class. In doing this, you can reuse the fields and methods of the existing class without having to write (and debug!) them yourself" 的页面中得到了这个,但我还是不明白你的意思。
【解决方案3】:

在这里,我对您的代码进行了一些修改,但采用了类似的方式。 我不会延长 JFrame 直到并且除非我不想做一些有创意的事情,但你总是可以的。

你已经扩展了 JFrame ,所以不值得用 frame.foo() 调用方法 但简单的 foo() 和最重要的 JFrame frame = new HelloWorld() 是没有意义的,如果你已经用 JFrame 扩展了你的课程:

import javax.swing.*;

public class HelloWorld extends JFrame{

 public static void main(String[] args) {

          SwingUtilities.invokeLater(new Runnable() {
          public void run() {
          new HelloWorld().setVisible(true);
        }
    });

     }
    public  HelloWorld()
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Hello World Button App");

        panel pan= new panel();
        add(pan.panel);
        pack();
        setVisible(true);
    }
   }

   class panel {

      private JButton btn1 = new JButton("Klick!");
      private JTextField txt1 = new JTextField(10);
      private JTextField txt2 = new JTextField(10);
      JPanel panel;
      public panel() {
           panel = new JPanel();
           panel.add(btn1);
           panel.add(txt1);
           panel.add(txt2);
        }
      }

此外,您还可以使用 JPanel 扩展您的 panel 类:

 public  HelloWorld()
    {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Hello World Button App");

          panel pan= new panel();
         add(pan);
         pack();
         setVisible(true);
    }
   }

   class panel extends JPanel {

      private JButton btn1 = new JButton("Klick!");
      private JTextField txt1 = new JTextField(10);
      private JTextField txt2 = new JTextField(10);

      public panel() {

           add(btn1);
           add(txt1);
           add(txt2);
        }
      }

【讨论】:

  • 请学习 java 命名约定并遵守它们 扩展 JSomething 几乎总是次优的,它们应该按原样使用。
  • 你知道我为什么要做扩展和类似的事情吗?这是因为学校的老师是这样教我的:D 我会试试的,谢谢你的回复!
  • @kleopatra 是的,非常正确。只是更改了 OP 的代码基本代码。
  • @TomSchillemans 正如 - kleopatra 所建议的,“扩展 JSomething 几乎总是次优的,它们应该按原样使用”,你应该告诉你的老师,尽可能使用 JSomething 作为对象,我没有改变你代码的概念,为了你的方便,不要忘记命名约定。祝你好运!
  • :) +1 for “除非我不想做有创意的事情,否则我不会扩展 JFrame” ;)
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多