Java ItemListener复选框未按预期工作
我目前对我的最新项目有问题。 我是初学者,所以请记住:D 我想让我的项目做的是,如果选中复选框,则更改某些文本的字体,如果取消选中,则使其恢复正常 我已经设法实现了这一点 但是,有多行复选框。如果选择了2,而我取消选择其中一个,文本将变回正常。只要列中的复选框仍处于选中状态,我就不希望文本变为正常文本 我该怎么做=( 希望你们中的一个能帮助我Java ItemListener复选框未按预期工作,java,class,user-interface,jframe,listener,Java,Class,User Interface,Jframe,Listener,我目前对我的最新项目有问题。 我是初学者,所以请记住:D 我想让我的项目做的是,如果选中复选框,则更改某些文本的字体,如果取消选中,则使其恢复正常 我已经设法实现了这一点 但是,有多行复选框。如果选择了2,而我取消选择其中一个,文本将变回正常。只要列中的复选框仍处于选中状态,我就不希望文本变为正常文本 我该怎么做=( 希望你们中的一个能帮助我 import java.awt.Color; public class WindowBuilderTest extends JFrame { priv
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);
}
}
}
}有几种方法可以实现您想要尝试的目标,但我认为问题更具概念性。您添加到面板中的每个复选框都有其*自己的*FontChanger。每个FontChanger都不知道其他FontChanger或复选框。相反,您可以做的是在面板中添加一个FontChanger在itemStateChanged()方法中,所有复选框都有一种方法可以让单个FontChanger知道每个复选框的状态。通过这种方法,您可以检查是否选中了/选中了多少/选中了哪个复选框,并对其进行操作 编辑:下面是一个完整的示例(请注意,我已经对您的代码进行了大量修改,但还没有对其进行测试,这只是给您一个大致的想法。此外,我去掉了代码可读性的大多数最终关键字,此外,如果您没有特定的理由使用不同的线程来运行程序,则无需在新的Runnable()中运行WindowBuilderTest。),请参阅注释部分)
导入java.awt.Color;
导入java.util.*;
公共类WindowBuilderTest扩展了JFrame
{
私有JPanel内容窗格;
private FontChanger fChanger;//谢谢您的回答:)我理解一般的概念,但我不确定我自己能实现它的能力有多强。你能给我一个大致的起点来帮助我吗?你的WindowBuilderTest类应该有一个私有的FontChanger fChanger;
变量。在你的构造函数开始时,你可以像这样实例化这个变量://角色标题最终JTextArea txtTop=new JTextArea();fChanger=new FontChanger(txtTop);..
然后继续使用相同的addCheckBox()方法添加复选框,但您的方法将如下所示:private void addCheckBox[…]最终JCheckBox checkBox=new JCheckBox();checkBox.setBounds(x,y,宽度,高度);复选框.AdditEistListNER(fchange);.< /Cord>然后更改ItEntStEnEddieDe()。如果还不清楚,我可以更详细地更新我以前的答案。没问题,考虑一下我的建议答案,如果你的问题是选择的答案,如果是这样的话:.好的,我对代码失去了控制^^我真的不知道我现在在做什么。你能给我一些更详细的信息吗?:/
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);
}
}
}
}