1

フォントスタイル、フォントサイズ、すべてクリアなどを設定できるシンプルなテキストエディタを作成していました。フォントサイズを設定するには、JComboBoxを追加し、ItemListenerを実装しました。これが私のMainWindowクラスです:

import javax.swing.*;

public class MainWindow extends JFrame{
Editor e = new Editor();

public MainWindow(){
    super(".:My Text Editor:.");
    getContentPane().add(e);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    pack();
    setVisible(true);
}

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

}

}

これが私のEditorクラスです:

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

public class Editor extends JPanel{
JPanel optionPanel = new JPanel();
JTextArea editArea = new JTextArea();
JButton boldBtn = new JButton("Bold");
JButton italicBtn = new JButton("Italic");
JButton plainBtn = new JButton("Plain");
JButton clearBtn = new JButton("Clear all");
String [] fontSizes = {"10","11","12","13","14","15","16","17","18","19","20"};
int fontSize;
JComboBox combo = new JComboBox(fontSizes);

public Editor(){
    createUI();
    addEvents();
}

public void createUI(){
    optionPanel.add(boldBtn);
    optionPanel.add(italicBtn);
    optionPanel.add(plainBtn);
    optionPanel.add(combo);
    optionPanel.add(clearBtn);

    setLayout(new BorderLayout());
    add(optionPanel,BorderLayout.NORTH);
    add(new JScrollPane(editArea),BorderLayout.CENTER);
    setPreferredSize(new Dimension(640,480));
}

public void addEvents(){

    boldBtn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            editArea.setFont(new Font("Sans Serif",Font.BOLD,fontSize));
        }
    });

    italicBtn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            editArea.setFont(new Font("Sans Serif",Font.ITALIC,fontSize));

        }
    });

    plainBtn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            editArea.setFont(new Font("Sans Serif",Font.PLAIN,fontSize));
        }
    });

    combo.addItemListener(new ItemListener(){

        public void itemStateChanged(ItemEvent e){
            int ind = combo.getSelectedIndex();
            System.out.println(ind); 
            fontSize = Integer.parseInt(fontSizes[ind]);
            editArea.setFont(new Font("Sans Serif",Font.PLAIN,fontSize));
        }
    });

    clearBtn.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            editArea.setText("");
        }
    });
}

}

さて、奇妙なことが起こったのは、System.out.println(ind);を置いたときです。getSelectedIndex()メソッドが返すインデックスを確認するための行。クリックしたアイテムに応じて、次のように返されます。

1
1
0
0
2
2
3
3

なぜこうなった?1 0 2 3だけ返してはいけませんか?前もって感謝します。

4

3 に答える 3

3

JComboBox で選択を変更すると、itemStateChanged イベントが 2 回トリガーされます。1 回は古い選択項目の DESELECT で、もう 1 回は新しく選択された項目の SELECT です。

コードを一度だけ実行したい場合は、次のようにします。

if (e.getStateChange() == ItemEvent.SELECTED) {
...
}
于 2012-08-22T21:36:00.357 に答える
3

JCombobox は、ItemEvent.getStateChanged() で区別する SELECTED と DESELECTED に対して itemStateChanged を 2 回起動します。したがって、コードを次のように if でラップします。

public void itemStateChanged( ItemEvent event ) {
    if( event.getStateChanged() == ItemEvent.SELECTED ) {
        // code here
    }
}
于 2012-08-22T21:36:38.053 に答える
2

itemStateChanged が 2 回トリガーされているようです。ItemEvent パラメータは毎回同じではないと思います。おそらく、何かを行う前にイベントの種類を確認する必要があります。

申し訳ありませんが、今は確認できませんが、まだサポートが必要な場合は後で確認します.

于 2012-08-22T21:39:22.483 に答える