我正在嘗試創建一個簡單的清單程式來了解有關復選框的更多資訊,我的主要目標是檢查所有復選框,關閉框架,并顯示一條訊息說您已完成。我試圖將它全部放在最后一部分的函式中,因為框架和復選框似乎可以作業,但發現我無法寫入該特定函式內的變數。我主要是在尋找不同的研究選項,或者可能是我目前的實作中缺少什么
public static void simpleChecklist(){
JFrame f= new JFrame("Simple Checklist");
f.setLayout(null);
f.setVisible(true);
f.setSize(400,400);
//JButton done = new JButton();
//done.setBounds(150,300,50,50);
//f.add(done);
boolean projectWork = false;
JCheckBox ProjectWork = new JCheckBox("Project Work", projectWork);
ProjectWork.setBounds(100,50, 200,50);
boolean math = false;
JCheckBox Math = new JCheckBox("Math", math);
Math.setBounds(100,100, 100,50);
boolean science = false;
JCheckBox Science = new JCheckBox("Science", science);
Science.setBounds(100,150,100,50);
boolean compSci = false;
JCheckBox CompSci = new JCheckBox("Comp Sci", compSci);
CompSci.setBounds(100,200,100,50);
boolean english = false;
JCheckBox English = new JCheckBox("English", english);
English.setBounds(100,250,100,50);
boolean gov = false;
JCheckBox Gov = new JCheckBox("Government", gov);
Gov.setBounds(100,300,100,50);
f.add(Gov);
f.add(English);
f.add(CompSci);
f.add(Science);
f.add(ProjectWork);
f.add(Math);
/*{done.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});*/
class ItemListen implements ItemListener {
public void itemStateChanged(ItemEvent arg0) {
Gov.addItemListener(new ItemListen());
English.addItemListener(new ItemListen());
CompSci.addItemListener(new ItemListen());
Science.addItemListener(new ItemListen());
ProjectWork.addItemListener(new ItemListen());
Math.addItemListener(new ItemListen());
// Different Get Methods from ActionEvent
/* arg0.getItemSelectable()
arg0.getStateChange()
arg0.getItem()*/
}
}
boolean govDone = false;
boolean englishDone = false;
boolean compSciDone = false;
boolean scienceDone = false;
boolean projectWorkDone = false;
boolean mathDone = false;
if(Math.isSelected()){
mathDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
System.out.println("1");
}
if(ProjectWork.isSelected()){
projectWorkDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
}
if(Science.isSelected()){
scienceDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
}
if(English.isSelected()){
englishDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
}
if(Gov.isSelected()){
govDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
}
if(CompSci.isSelected()){
compSciDone = true;
checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone);
}
}
private static void checkIfDone(boolean projectWorkDone, boolean mathDone, boolean scienceDone,JFrame f, boolean compSciDone, boolean englishDone, boolean govDone){
if (projectWorkDone == true && mathDone == true && scienceDone == true && compSciDone == true && englishDone == true && govDone == true){
closeWindow(f);
}
}
private static void closeWindow(JFrame f){
f.dispose();
JOptionPane.showMessageDialog(null,"Congrats! You Finished Your Work!!!");
}
uj5u.com熱心網友回復:
首先看看...
import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.border.EmptyBorder; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { public TestPane() { setBorder(new EmptyBorder(16, 16, 16, 16)); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; gbc.anchor = GridBagConstraints.LINE_START; JCheckBox projectWork = new JCheckBox("Project Work", false); JCheckBox math = new JCheckBox("Math", false); JCheckBox science = new JCheckBox("Science", false); JCheckBox compSci = new JCheckBox("Comp Sci", false); JCheckBox english = new JCheckBox("English", false); JCheckBox gov = new JCheckBox("Government", false); add(projectWork, gbc); add(math, gbc); add(science, gbc); add(compSci, gbc); add(english, gbc); add(gov, gbc); JCheckBox checkBoxes[] = new JCheckBox[] { projectWork, math, science, compSci, english, gov }; ActionListener listener = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean completed = true; for (JCheckBox cb : checkBoxes) { if (!cb.isSelected()) { completed = false; break; } } if (completed) { JOptionPane.showMessageDialog(TestPane.this, "All your class belong to us"); SwingUtilities.windowForComponent(TestPane.this).dispose(); } } }; for (JCheckBox cb : checkBoxes) { cb.addActionListener(listener); } } } public static void simpleChecklist() { JFrame f = new JFrame("Simple Checklist"); f.setLayout(null); f.setVisible(true); f.setSize(400, 400); //JButton done = new JButton(); //done.setBounds(150,300,50,50); //f.add(done); boolean projectWork = false; JCheckBox ProjectWork = new JCheckBox("Project Work", projectWork); ProjectWork.setBounds(100, 50, 200, 50); boolean math = false; JCheckBox Math = new JCheckBox("Math", math); Math.setBounds(100, 100, 100, 50); boolean science = false; JCheckBox Science = new JCheckBox("Science", science); Science.setBounds(100, 150, 100, 50); boolean compSci = false; JCheckBox CompSci = new JCheckBox("Comp Sci", compSci); CompSci.setBounds(100, 200, 100, 50); boolean english = false; JCheckBox English = new JCheckBox("English", english); English.setBounds(100, 250, 100, 50); boolean gov = false; JCheckBox Gov = new JCheckBox("Government", gov); Gov.setBounds(100, 300, 100, 50); f.add(Gov); f.add(English); f.add(CompSci); f.add(Science); f.add(ProjectWork); f.add(Math); /*{done.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { } });*/ class ItemListen implements ItemListener { public void itemStateChanged(ItemEvent arg0) { Gov.addItemListener(new ItemListen()); English.addItemListener(new ItemListen()); CompSci.addItemListener(new ItemListen()); Science.addItemListener(new ItemListen()); ProjectWork.addItemListener(new ItemListen()); Math.addItemListener(new ItemListen()); // Different Get Methods from ActionEvent /* arg0.getItemSelectable() arg0.getStateChange() arg0.getItem()*/ } } boolean govDone = false; boolean englishDone = false; boolean compSciDone = false; boolean scienceDone = false; boolean projectWorkDone = false; boolean mathDone = false; if (Math.isSelected()) { mathDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); System.out.println("1"); } if (ProjectWork.isSelected()) { projectWorkDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); } if (Science.isSelected()) { scienceDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); } if (English.isSelected()) { englishDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); } if (Gov.isSelected()) { govDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); } if (CompSci.isSelected()) { compSciDone = true; checkIfDone(projectWorkDone, mathDone, scienceDone, f, compSciDone, englishDone, govDone); } } private static void checkIfDone(boolean projectWorkDone, boolean mathDone, boolean scienceDone, JFrame f, boolean compSciDone, boolean englishDone, boolean govDone) { if (projectWorkDone == true && mathDone == true && scienceDone == true && compSciDone == true && englishDone == true && govDone == true) { closeWindow(f); } } private static void closeWindow(JFrame f) { f.dispose(); JOptionPane.showMessageDialog(null, "Congrats! You Finished Your Work!!!"); } }uj5u.com熱心網友回復:
這是您想要做的版本。它更簡單,因為它使用布局管理器來對齊復選框。執行緒使問題復雜化,并非完全必要,我將在后面解釋。
import java.awt.Dimension; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.BoxLayout; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ItemListenerDemo extends JPanel implements ItemListener { JFrame f = new JFrame("Listener Demo"); String[] subjects = { "CompSci", "Math", "History", "Sociology", "Chemistry" }; int checkCount = 0; public static void main(String[] args) { SwingUtilities .invokeLater(() -> new ItemListenerDemo().start()); } // basic boiler plate public void start() { // add the panel to the frame f.add(this); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // resize and position the components f.pack(); // BoxLayout will align them from top to bottom. setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); // install the checkboxes // add the subject, the listener, and add to the panel for (String subject : subjects) { JCheckBox b = new JCheckBox(subject); b.addItemListener(this); add(b); // add to panel } // center on screen f.setLocationRelativeTo(null); f.setVisible(true); // wait for a signal to check and see if all boxes are checked new Thread(() -> { synchronized (this) { while (true) { try { wait(); } catch (InterruptedException ie) { } if (checkCount == subjects.length) { int action = JOptionPane.showConfirmDialog(null, "Congrats! You Finished Your Work!!!\n Do you want to quit?"); if (action == JOptionPane.YES_OPTION) { System.exit(0); } } } } }).start(); } public Dimension getPreferredSize() { return new Dimension(200, 200); } public void itemStateChanged(ItemEvent e) { Object source = e.getSource(); if (source instanceof JCheckBox) { JCheckBox b = (JCheckBox) source; // adjust the checkCount based on this checkboxes status. checkCount = b.isSelected() ? 1 : -1; // signal those threads waiting. synchronized (this) { notify(); } } } }執行緒的目的有兩個。
注意我的
SwingUtilities發言。這開始了包括while(true)回圈在內的 EDT 中的整個程序。所以 EDT 永遠不會退出,因為回圈永遠不會結束。該回圈等待事件調度執行緒 (EDT) 完成其業務,然后讓另一個執行緒檢查checkCount. 如果我在itemStateChanged方法中做了這個檢查,最后一個復選框就沒有了,visibly appeared to be checked因為我還在 EDT 中,繪畫無法完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/374395.html
