0

現在、最新のプロジェクトで問題が発生しています。私は初心者なので、覚えておいてください:D

プロジェクトでやりたいことは、チェックボックスが選択されている場合はテキストのフォントを変更し、選択されていない場合は通常に戻すことです。

私はすでにそれを実装することができました。

ただし、チェックボックスが複数行あります。2 つが選択されていて、そのうちの 1 つを選択解除すると、テキストは通常​​の状態に戻ります。列のチェックボックスがまだ選択されている限り、テキストが正常になりたくありません。

どうやってやるの?=(

うまくいけば、あなたの一人が私を助けることができます!

import java.awt.Color;

public class WindowBuilderTest extends JFrame
{

private JPanel  contentPane;

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

// Creating Frame
public WindowBuilderTest()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 1280, 720);
    this.contentPane = new JPanel();
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(this.contentPane);
    this.contentPane.setLayout(null);

    // Create Font
    final Font headfont = new Font("Serif", Font.PLAIN, 15);
    final Font headfontRed = new Font("Serif", Font.PLAIN, 15);

    // Role Headlines
    final JTextArea txtTop = new JTextArea();
    txtTop.setEditable(false);
    txtTop.setText("TOP");
    txtTop.setBounds(180, 95, 32, 23);
    this.contentPane.add(txtTop);

    final JTextArea txtMid = new JTextArea();
    txtMid.setEditable(false);
    txtMid.setText("MID");
    txtMid.setBounds(252, 95, 32, 23);
    this.contentPane.add(txtMid);

    final JTextArea txtJng = new JTextArea();
    txtJng.setEditable(false);
    txtJng.setText("JNG");
    txtJng.setBounds(320, 95, 32, 23);
    this.contentPane.add(txtJng);

    final JTextArea txtAdc = new JTextArea();
    txtAdc.setEditable(false);
    txtAdc.setText("ADC");
    txtAdc.setBounds(389, 95, 32, 23);
    this.contentPane.add(txtAdc);

    final JTextArea txtSup = new JTextArea();
    txtSup.setEditable(false);
    txtSup.setText("SUP");
    txtSup.setBounds(453, 95, 32, 23);
    this.contentPane.add(txtSup);

    // Checkbox 1st row
    addCheckBox(183, 143, 23, 23, txtTop);
    addCheckBox(255, 143, 23, 23, txtMid);
    addCheckBox(322, 143, 23, 23, txtJng);
    addCheckBox(393, 143, 23, 23, txtAdc);
    addCheckBox(457, 143, 23, 23, txtSup);

    // Checkbox 2nd row
    addCheckBox(183, 200, 23, 23, txtTop);
    addCheckBox(255, 200, 23, 23, txtMid);
    addCheckBox(322, 200, 23, 23, txtJng);
    addCheckBox(393, 200, 23, 23, txtAdc);
    addCheckBox(457, 200, 23, 23, txtSup);

    // Checkbox 3nd row
    addCheckBox(183, 257, 23, 23, txtTop);
    addCheckBox(255, 257, 23, 23, txtMid);
    addCheckBox(322, 257, 23, 23, txtJng);
    addCheckBox(393, 257, 23, 23, txtAdc);
    addCheckBox(457, 257, 23, 23, txtSup);
}


private void addCheckBox(final int x, final int y, final int width, final int height, final JTextArea txtTop)
{
    final JCheckBox checkBox = new JCheckBox();
    checkBox.setBounds(x, y, width, height);
    checkBox.addItemListener(new FontChanger(txtTop));
    this.contentPane.add(checkBox);
}

class FontChanger implements ItemListener
{
    private JTextArea textArea;

    public FontChanger(final JTextArea textArea)
    {
        this.textArea = textArea;
    }

    @Override
    public void itemStateChanged(final ItemEvent e)
    {
        if (e.getStateChange() == ItemEvent.SELECTED)
        {
            final Font boldFont = this.textArea.getFont().deriveFont(Font.BOLD);
            this.textArea.setForeground(Color.RED);
            this.textArea.setFont(boldFont);
        }
        else
        {
            final Font boldFont = this.textArea.getFont().deriveFont(Font.PLAIN);
            this.textArea.setForeground(Color.BLACK);
            this.textArea.setFont(boldFont);
        }
    }
}

}

4

1 に答える 1

0

やりたいことを達成する方法はいくつかありますが、問題はより概念的なものだと思います。パネルに追加する各チェックボックスには、独自の* FontChanger があります。これらの各 FontChanger は、他の FontChanger やチェック ボックスを認識していません。代わりにできることは、単一の FontChanger をすべてのチェックボックスに追加し、単一の FontChanger に itemStateChanged() メソッドの各チェックボックスの状態を知らせる方法を用意することです。このようにして、チェックボックスが選択されているかどうか/いくつ/どのチェックボックスが選択されているかを確認し、それに基づいて行動することができます。

編集:ここに完全な例があります(コードを大幅に変更し、テストしていないことに注意してください。これは、一般的なアイデアを提供するためのものです。また、コードを読みやすくするために、最後のキーワードのほとんどを削除しました。別のスレッドを使用してプログラムを実行する特別な理由はありません。新しい Runnable() で WindowBuilderTest を実行する必要はありません。コメント セクションを参照してください)。

import java.awt.Color;
import java.util.*;

public class WindowBuilderTest extends JFrame
{

private JPanel  contentPane;
private FontChanger fChanger; //<--NEW
private JTextArea txtTop; //<--NEW
private List<CheckBox> checkBoxes; //<--NEW

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

    //just use this and comment out the whole Eventqueue block.
    /*
    WindowBuilderTest frame = new WindowBuilderTest();
    frame.setVisible(true);
    */
}

// Creating Frame
public WindowBuilderTest()
{
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 1280, 720);
    this.contentPane = new JPanel();
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(this.contentPane);
    this.contentPane.setLayout(null);

    // Create Font
    Font headfont = new Font("Serif", Font.PLAIN, 15);
    Font headfontRed = new Font("Serif", Font.PLAIN, 15);

    // Role Headlines
    txtTop = new JTextArea(); //<--NEW
    fChanger = new FontChanger(txtTop); //<--NEW
    checkBoxes = new ArrayList<CheckBox>(); //<-- NEW you will need to update your imports.

    txtTop.setEditable(false);
    txtTop.setText("TOP");
    txtTop.setBounds(180, 95, 32, 23);
    this.contentPane.add(txtTop);

    final JTextArea txtMid = new JTextArea();
    txtMid.setEditable(false);
    txtMid.setText("MID");
    txtMid.setBounds(252, 95, 32, 23);
    this.contentPane.add(txtMid);

    final JTextArea txtJng = new JTextArea();
    txtJng.setEditable(false);
    txtJng.setText("JNG");
    txtJng.setBounds(320, 95, 32, 23);
    this.contentPane.add(txtJng);

    final JTextArea txtAdc = new JTextArea();
    txtAdc.setEditable(false);
    txtAdc.setText("ADC");
    txtAdc.setBounds(389, 95, 32, 23);
    this.contentPane.add(txtAdc);

    final JTextArea txtSup = new JTextArea();
    txtSup.setEditable(false);
    txtSup.setText("SUP");
    txtSup.setBounds(453, 95, 32, 23);
    this.contentPane.add(txtSup);

    // Checkbox 1st row
    addCheckBox(183, 143, 23, 23, txtTop);
    addCheckBox(255, 143, 23, 23, txtMid);
    addCheckBox(322, 143, 23, 23, txtJng);
    addCheckBox(393, 143, 23, 23, txtAdc);
    addCheckBox(457, 143, 23, 23, txtSup);

    // Checkbox 2nd row
    addCheckBox(183, 200, 23, 23, txtTop);
    addCheckBox(255, 200, 23, 23, txtMid);
    addCheckBox(322, 200, 23, 23, txtJng);
    addCheckBox(393, 200, 23, 23, txtAdc);
    addCheckBox(457, 200, 23, 23, txtSup);

    // Checkbox 3nd row
    addCheckBox(183, 257, 23, 23, txtTop);
    addCheckBox(255, 257, 23, 23, txtMid);
    addCheckBox(322, 257, 23, 23, txtJng);
    addCheckBox(393, 257, 23, 23, txtAdc);
    addCheckBox(457, 257, 23, 23, txtSup);
}


private void addCheckBox(int x, int y, int width, int height)
{
    JCheckBox checkBox = new JCheckBox();
    checkBoxes.add(checkBox); // <-- NEW (add to checkboxes list)
    checkBox.setBounds(x, y, width, height);
    checkBox.addItemListener(fChanger); // <-- NEW (add the same listener to all)
    this.contentPane.add(checkBox);
}

class FontChanger implements ItemListener
{
    private JTextArea textArea;

    public FontChanger(JTextArea textArea)
    {
        this.textArea = textArea;
    }

    @Override
    public void itemStateChanged(ItemEvent e)
    {
        if (e.getStateChange() == ItemEvent.SELECTED)
        {
            Font boldFont = this.textArea.getFont().deriveFont(Font.BOLD);
            this.textArea.setForeground(Color.RED);
            this.textArea.setFont(boldFont);
        }
        else
        {
            //iterate through list of checkboxes to see if there's still one selected.
            boolean stillOneCheckBoxSelected = false;
            for(int i = 0; i < checkBoxes.size(); i++){
                if(checkBoxes.get(i).isSelected()){ // <- Verify the method here, not sure
                    stillOneCheckBoxSelected = true;
                    break;
                }
            }
            if(!stillOneCheckBoxSelected){//if no check boxes are selected, reset
                Font boldFont = this.textArea.getFont().deriveFont(Font.PLAIN);
                this.textArea.setForeground(Color.BLACK);
                this.textArea.setFont(boldFont);
            }
        }
    }
}

繰り返しますが、私はこれをテストしていません。パッチを適用する必要があるかもしれませんが、ここから続行できると思います。ここに ArrayLists の JavaDoc へのリンクがあります。参照してください: ArrayList JavaDoc

2番目の編集: 質問を読み直しましたが、実際には特定の列セットに対してのみこのロジックが必要なため、ロジックを変更して、関連するチェックボックスのみをリストに追加し、チェックを行うたびに、関連するチェックボックスのみがチェックされます。

于 2013-09-26T15:27:35.960 に答える