2

この Java コードが機能しない理由がわかりません。これは私が取り組んでいるGUIプロジェクトであり、いくつかのチェックボックスを介してJLabelを太字、斜体などに変更しようとしています:

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class FontViewer {
static JCheckBox checkBoxBold;
static JCheckBox checkBoxItalic;
static JCheckBox checkBoxCenter;
static JPanel textPanel;
static JLabel textLabel;
static JComboBox fontName;
static JComboBox fontSize;

static ActionListener listener;

public static void main(String[] args) {
    final int FRAME_SIZE_X = 250;
    final int FRAME_SIZE_Y = 400;

    JFrame frame = new JFrame();
    frame.setSize(FRAME_SIZE_X, FRAME_SIZE_Y);

    JPanel face = new JPanel();
    face.setLayout(new GridLayout(2, 1));

    JPanel bottomFace = new JPanel();
    bottomFace.setLayout(new GridLayout(3, 1));

    textPanel = createTextPanel();

    JPanel checkBoxPanel = createCheckBoxPanel();

    JPanel comboPanel = createComboPanel();

    JPanel radioButtonsPanel = createButtonsPanel();

    face.add(textPanel);

    bottomFace.add(checkBoxPanel);
    bottomFace.add(comboPanel);
    bottomFace.add(radioButtonsPanel);

    face.add(bottomFace);

    frame.add(face);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

    class FontListener implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            int fontStyle = 0;
            if (checkBoxBold.isSelected())
                fontStyle = fontStyle + Font.BOLD;
            if (checkBoxItalic.isSelected())
                fontStyle = fontStyle + Font.ITALIC;
            if (checkBoxCenter.isSelected())
                textPanel.add(textLabel, BorderLayout.CENTER);

            String textFont = (String) fontName.getSelectedItem();

            int textSize = Integer.parseInt((String) fontSize
                    .getSelectedItem());

            textLabel.setFont(new Font(textFont, fontStyle, textSize));
            textLabel.repaint();
        }
    }

    listener = new FontListener();
}

private static JPanel createTextPanel() {
    textPanel = new JPanel();

    textPanel.setLayout(new BorderLayout());
    textLabel = new JLabel("Java Text");
    textPanel.add(textLabel, BorderLayout.WEST);

    return textPanel;
}

private static JPanel createCheckBoxPanel() {
    JPanel checkBoxPanel = new JPanel();

    checkBoxBold = new JCheckBox("Bold");
    checkBoxItalic = new JCheckBox("Italic");
    checkBoxCenter = new JCheckBox("Center");

    checkBoxBold.addActionListener(listener);
    checkBoxItalic.addActionListener(listener);
    checkBoxCenter.addActionListener(listener);

    checkBoxPanel.add(checkBoxBold);
    checkBoxPanel.add(checkBoxItalic);
    checkBoxPanel.add(checkBoxCenter);

    return checkBoxPanel;
}

private static JPanel createComboPanel() {
    JPanel comboPanel = new JPanel();

    fontName = new JComboBox();
    fontName.addItem("Serif");
    fontName.addItem("Courier");

    fontSize = new JComboBox();
    fontSize.addItem("12");
    fontSize.addItem("24");
    fontSize.addItem("36");

    comboPanel.add(fontName);
    comboPanel.add(fontSize);

    return comboPanel;
}

private static JPanel createButtonsPanel() {
    JPanel radioButtonsPanel = new JPanel();

    JRadioButton redButton = new JRadioButton("Red");
    JRadioButton whiteButton = new JRadioButton("White");
    JRadioButton blueButton = new JRadioButton("Blue");

    ButtonGroup colors = new ButtonGroup();
    colors.add(redButton);
    colors.add(whiteButton);
    colors.add(blueButton);

    radioButtonsPanel.add(redButton);
    radioButtonsPanel.add(whiteButton);
    radioButtonsPanel.add(blueButton);

    return radioButtonsPanel;
}

}

チェックボックスのいずれかを押しても、JLabel オブジェクトは変化しません。どんな助けでも大歓迎です、そして前もってどうもありがとう。

注: 今のところ、チェック ボックスが機能しない理由を知りたいだけです。このコードは不完全です。私はこれを認識しています。もう一度ありがとう。

4

2 に答える 2

4

リスナーをチェック ボックスに追加したときの値listenernull. listenermain メソッドの最後まで初期化されません。

于 2012-11-05T21:01:50.207 に答える
1

を作成する前に、リスナーの初期化を試みてくださいJFrame。それは私のために働いた。もちろん、FontListenerクラスの定義はlistener宣言の前に置く必要があります。

//...
listener = new FontListener();
JFrame frame = new JFrame();
//...
于 2012-11-05T21:07:36.703 に答える