0

已解决的问题:我将windowbuilder的快速测试/预览按钮与 eclipse 的编译按钮混合在一起:

在此处输入图像描述 (只有通过“意外”将鼠标停在按钮上并看到它无法编译才发现)


原始问题

我有一个非常具体的问题:

我有两个不同的课程:

  • 类 1 在 JFrame 中实现 JPanel。

  • 类 2 仅实现 JFrame。

在 Class 2 中,以下代码完美运行:

import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JTextPane;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class frameTest extends JFrame {

private JPanel contentPane;
private JTextField txtGeefLiefde;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frameTest frame = new frameTest();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public frameTest() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 450, 300);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);

    JButton btnTest = new JButton("press");

    btnTest.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            testFunction();
        }
    });
    btnTest.setBounds(162, 188, 89, 23);
    contentPane.add(btnTest);

}

public void testFunction()
{
    JTextPane textPane = new JTextPane();
    textPane.setBounds(162, 231, 89, 20);
    textPane.setText(":)");
    contentPane.add(textPane);
}

}

现在我也想在 Class 1 中实现完全相同的功能。

我尝试了以下方法:

    import java.awt.event.MouseAdapter;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.MouseEvent;

    public class frontpanel extends JFrame {

    private JPanel panel;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                frontpanel frame = new frontpanel();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */
public frontpanel() {

            JButton btnTest = new JButton("press");

            btnTest.addActionListener(new ActionListener() {
                   public void actionPerformed(ActionEvent e) {

                        testFunction();

                   }
            });
            btnTest.setBounds(162, 188, 89, 23);
            panel.add(btnTest);
    }
        public void testFunction()
        { 
        JTextPane textPane = new JTextPane();
        textPane.setBounds(162, 231, 89, 20);
        textPane.setText(":)");
        panel.add(textPane);
        }
    }

panelJFrame中的JPanel在哪里。

我已经坚持了几个小时。我似乎无法让任何ActionListener工作。是什么导致了问题?

非常感谢所有帮助!

4

2 回答 2

2

给出下面稍微修改的代码以适合我的代码测试用例,添加panel初始化并将其添加到Test框架中,您提到的是复制/粘贴错误,具有易于测试的尺寸,代码在我这边运行良好。

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;

public class Test extends JFrame {

  private JPanel panel = new JPanel();

/**
 * Launch the application.
 */
   public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
  public void run() {
    try {
          Test frame = new Test();
          frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  /**
   * Create the frame.
   */
  public Test() {
    this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    JButton btnTest = new JButton("press");

    btnTest.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {

        testFunction();
      }
    });

    btnTest.setBounds(162, 188, 89, 23);
    panel.add(btnTest);
    this.setSize(new Dimension(300, 300));
    this.add(panel);
  }

  public void testFunction()
  { 
    JTextPane textPane = new JTextPane();
    textPane.setBounds(162, 231, 89, 20);
    textPane.setText(":)");
    panel.add(textPane);
  }
}
于 2013-08-21T20:02:00.863 回答
2

问题是您从未初始化过panel,而且您必须添加到jframe

    public FrontPanel() {

                JButton btnTest = new JButton("press");

                btnTest.addActionListener(new ActionListener() {
                       public void actionPerformed(ActionEvent e) {

                            testFunction();

                       }
                });
               // btnTest.setBounds(162, 188, 89, 23);  you should avoid using this
                panel = new JPanel();
                panel.add(btnTest);
                this.add(panel);
                this.pack();                                                 
        }

}

顺便说一句,同样重要的是,

1) 遵循Java 代码约定类名以大写字母开头。

JFrame2)如果您没有覆盖JFrame行为,请不要扩展而不是使用组合来对抗继承。

例子:

public class FrontPanel{

  private JFrame frame;
  private JPanel panel;

}

3)不要使用setBounds而不是将这项工作委托给LayoutManager. 使用布局管理器

于 2013-08-21T19:38:40.680 回答