【问题标题】:Error: "Uncompilable source code"错误:“无法编译的源代码”
【发布时间】:2013-05-23 03:21:58
【问题描述】:

我处于初步阶段,无论我尝试什么,似乎都无法让程序运行。我认为这个问题与我如何称呼关键字“this”有关,但我不能确定。

现在我的程序只是简单地打印出 JComboBox 中突出显示的内容,以便保持简单,因为稍后可以使用“if”语句简单地完成比较方面。任何帮助表示赞赏。这是我的代码:

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

public class Main extends JPanel implements ActionListener {
    JFrame frame;
    JPanel panel;
    JLabel label1;
    JLabel label2;

    public Main() {
        super(new BorderLayout());

        String[] colorStrings = { "", "Black", "White", "Red", "Blue", "Yellow",
        "Green", "Orange", "Purple"};
        JComboBox color1 = new JComboBox(colorStrings);
        color1.setSelectedIndex(7);
        color1.addActionListener(this);
        JComboBox color2 = new JComboBox(colorStrings);
        color2.setSelectedIndex(7);
        color2.addActionListener(this);

        add(label1, BorderLayout.PAGE_START);
        add(color1, BorderLayout.PAGE_START);
        add(label2, BorderLayout.PAGE_END);
        add(color2, BorderLayout.PAGE_END);
        setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
    }

    public void actionPerformed(ActionEvent e) {
        JComboBox listen1 = (JComboBox)e.getSource();
        String otherColor1 = (String)listen1.getSelectedItem();
        System.out.println(otherColor1);
        JComboBox listen2 = (JComboBox)e.getSource();
        String otherColor2 = (String)listen2.getSelectedItem();
        System.out.println(otherColor2);
    }
    private static void createAndShowGUI(JComboBox color1, JComboBox color2) {
        JFrame frame = new JFrame("Does it match?");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent newContentPane = new Main();
        newContentPane.add(color1, color2);
        newContentPane.setOpaque(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
    }

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
} 
}

出现的错误是:

运行: 线程“AWT-EventQueue-0”中的异常 java.lang.RuntimeException:无法编译的源代码 - 错误的 sym 类型:createAndShowGUI 在 Main$1.run(Main.java:53) 在 java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) 在 java.awt.EventQueue.access$200(EventQueue.java:103) 在 java.awt.EventQueue$3.run(EventQueue.java:688) 在 java.awt.EventQueue$3.run(EventQueue.java:686) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:697) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 构建成功(总时间:3 秒)

【问题讨论】:

  • 什么是“JObjectBox”?没听说过那种动物。请在您的问题中仅使用真实的班级名称以避免混淆。
  • 什么意思“无论如何都无法让程序运行”
  • 程序不会按原样运行。
  • "The program will not run as is." -- 所以当你尝试运行它时,你会得到一个错误?如果是这样,请告诉我们错误。
  • JComboBox** 真正的类名是什么意思?

标签: java swing this jcombobox runtimeexception


【解决方案1】:
  1. createAndShowGUI 需要两个参数,但在您的 main 方法中,您没有传递任何参数。无论如何,当您在 Main 类中创建它们时,我不明白为什么您实际上需要它们...
  2. 您创建了一个名为 newContentPaneMain 实例,但实际上从未将其添加到任何内容中...
  3. 您将label1label2 添加到BorderLayout 内的相同位置,有效隐藏label1
  4. 您正在将color1color2 添加到BorderLayout 内的相同位置,从而有效地隐藏color1
  5. 你永远不会疯狂 label1label2 导致 NullPointerException

另外,你actionListener逻辑错了……

JComboBox listen1 = (JComboBox) e.getSource();
String otherColor1 = (String) listen1.getSelectedItem();
System.out.println(otherColor1);
JComboBox listen2 = (JComboBox) e.getSource();
String otherColor2 = (String) listen2.getSelectedItem();

listen1listen2 是同一个东西...

工作示例

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JPanel implements ActionListener {

    JFrame frame;
    JPanel panel;
    JLabel label1;
    JLabel label2;

    public Main() {
        // Change the layout to something more useful
        super(new GridLayout(2, 2));

        String[] colorStrings = {"", "Black", "White", "Red", "Blue", "Yellow",
            "Green", "Orange", "Purple"};
        JComboBox color1 = new JComboBox(colorStrings);
        color1.setSelectedIndex(7);
        color1.addActionListener(this);
        JComboBox color2 = new JComboBox(colorStrings);
        color2.setSelectedIndex(7);
        color2.addActionListener(this);

        // Create the instances of the labels to prevent NullPointerException
        label1 = new JLabel("#1");
        label2 = new JLabel("#2");

        add(label1);
        add(color1);
        add(label2);
        add(color2);
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    }

    public void actionPerformed(ActionEvent e) {
        JComboBox listen1 = (JComboBox) e.getSource();
        String otherColor1 = (String) listen1.getSelectedItem();
        System.out.println(otherColor1);
        JComboBox listen2 = (JComboBox) e.getSource();
        String otherColor2 = (String) listen2.getSelectedItem();
        System.out.println(otherColor2);
    }

    // This doesn't make sense
//    private static void createAndShowGUI(JComboBox color1, JComboBox color2) {
    private static void createAndShowGUI() {
        JFrame frame = new JFrame("Does it match?");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent newContentPane = new Main();
        // Actually add the Main to the frame...
        frame.setContentPane(newContentPane);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                // This will now work
                createAndShowGUI();
            }
        });
    }
}

【讨论】:

  • 你在这里可能有点太有帮助了。 1+。即用勺子喂食。
  • 非常感谢!这正是我想要的。
  • @HovercraftFullOfEels 避免不可避免的“我该如何解决”评论:P
  • 我不知道。我认为我们通过挣扎来学习。他确实需要首先学习如何编译代码和修复编译错误,而不是他需要一个运行版本的问题。
  • 我也同意你的观点,这就是为什么我只是检查并跟踪了这个程序的每一行,直到我明白我做错了什么以及如何纠正它。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2021-05-22
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多