1

私は準備段階にあり、何を試してもプログラムを実行できないようです。この問題は、キーワード「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();
        }
    });
} 
}

表示されるエラーは次のとおりです。

run: スレッド "AWT-EventQueue-0" での例外 java.lang.RuntimeException: コンパイルできないソース コード - 誤った sym タイプ: createAndShowGUI at Main$1.run(Main.java:53) at 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(Native Method) で 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 で。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 秒)

4

1 に答える 1

4
  1. createAndShowGUIは2つのパラメーターを期待していますが、mainメソッドでは何も渡していません。Mainとにかくクラスでそれらを作成するときに、実際にそれらが必要な理由がわかりません...
  2. Main呼び出されたのインスタンスを作成しますが、newContentPane実際にそれを何かに追加することはありません...
  3. label1label2を 内の同じ位置に追加しBorderLayout、効果的に隠していますlabel1
  4. color1color2を 内の同じ位置に追加しBorderLayout、効果的に隠していますcolor1
  5. あなたは決して熱狂しlabel1たりlabel2NullPointerException

また、あなたの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();
            }
        });
    }
}
于 2013-05-23T03:28:22.167 に答える