【发布时间】:2011-11-11 01:26:47
【问题描述】:
我正在使用 JTabbedPane,每个选项卡上都有一个面板,当用户执行诸如单击按钮之类的操作时,该面板会发生变化。我遇到的问题是上一个面板中的元素被遗忘了。通常在将鼠标移到它们上之前您是看不到它们的,但有时在将鼠标移到它们应该的位置之前,您看不到 new 面板的元素是。所以很多时候一开始只有一点点可见,然后:
when you run your mouse over more stuff it becomes visible
repaint(); 几乎与其他所有行一样,在我更改 GUI 上的任何内容之前,我先执行removeAll();,但一切都会回来!有什么建议么?此面板的代码如下,如果它可能有帮助...
package com.GC01.gui;
import java.awt.Color;
public class PracticeQuizPanel extends JPanel implements MouseListener {
/**
* This panel will allow the user to practice quiz questions.
*/
private static final long serialVersionUID = 1L;
private User user = new User("misha");
boolean isMultipleChoice=false;
boolean usedClue=false;
boolean isStarted=false;
Calendar calendar = Calendar.getInstance();
AnswerAnalysis aA = new AnswerAnalysis();
private Quiz qz = new Quiz( Quiz.getQuestionsFromDisk(), 4, TabbedQuiz.getUser().getNumLogins() );
private JTextArea questionArea;
private JTextArea clueArea;
private JTextArea answerArea;
private JButton clueButton;
private JButton multiButton;
private JButton answerButton;
private JButton startButton;
private int index=0;
private Calendar startCalendar, endCalendar;
private JPanel backPanel;
public PracticeQuizPanel(){
add(new StartButtonPanel());
}
PracticeQuizPanel(int index) {
createVisualElements(index);
}
public void offerAnswer(){
endCalendar = Calendar.getInstance();
aA.setTimeSpent((int) (endCalendar.getTimeInMillis()-startCalendar.getTimeInMillis()));
aA.setRight(answerArea.getText());
JOptionPane.showMessageDialog(null, aA.toString());
answerArea.setEditable(false);
qz.setAnswersAnalysis(index, aA);
index++;
removeAll();
if( index<qz.getLength() ) createVisualElements(index);
else {
removeAll();
JOptionPane.showMessageDialog(null, qz.toFriendlyString());
addQuizResultsToUserProgress();
JOptionPane.showMessageDialog(null, qz.toFriendlyString());
UserProgress uP = new UserProgress(user);
System.out.println(uP.toString());
}
repaint();
startCalendar = Calendar.getInstance();
//JOptionPane.showMessageDialog(null, isStarted);
}
public void addQuizResultsToUserProgress(){
UserProgress userProgress = new UserProgress(user);
ArrayList<AnswerAnalysis> asA = userProgress.getAnswersAnalysis();
for (int i=0; i<qz.getLength(); i++){
asA.add( qz.getAnswersAnalysis()[i]);
}
userProgress.setAnswersAnalysis(asA);
userProgress.saveProgress();
}
/**
* This method creates/recreates all the text boxes, buttons etc. without resetting the quiz and
* the objects in memory.
*/
private void createVisualElements(int index){
if (TabbedQuiz.getUser().getNumLogins()<0)
JOptionPane.showMessageDialog(null, "There was an error. You may have done this quiz before.");
removeAll();
repaint();
startCalendar = Calendar.getInstance();
this.index=index;
setBackground(new Color(112, 128, 144));
setBounds(0,0,728,380);
setLayout(null);
questionArea = new JTextArea();
questionArea.setFont(TabbedQuiz.getDefaultFont().deriveFont(20));//new Font("Courier New", 0, 20));
questionArea.setEditable(false);
questionArea.setLineWrap(true);
questionArea.setWrapStyleWord(true);
questionArea.setBounds(295, 11, 423, 74);
add(questionArea);
//int index=0;
Question q = qz.getQuestions().get(index);
aA = new AnswerAnalysis(q.getQuestionID());
questionArea.setText(q.getQuestionText() );
clueArea = new JTextArea();
clueArea.setFont(TabbedQuiz.getDefaultFont().deriveFont(20));
clueArea.setEditable(false);
clueArea.setLineWrap(true);
clueArea.setWrapStyleWord(true);
clueArea.setBounds(295, 104, 423, 55);
add(clueArea);
JLabel lblQuestion = new JLabel("QUESTION:");
lblQuestion.setFont(TabbedQuiz.getDefaultFont().deriveFont(40));
lblQuestion.setBounds(43, 11, 216, 61);
add(lblQuestion);
answerArea = new JTextArea();//index+"");
answerArea.setFont(TabbedQuiz.getDefaultFont().deriveFont(20));
answerArea.setLineWrap(true);
answerArea.setWrapStyleWord(true);
answerArea.setBounds(295, 301, 423, 50);
answerArea.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) offerAnswer();
}
});
add(answerArea);
answerArea.setFocusable(true);
answerArea.requestFocusInWindow();
clueButton = new JButton("CLUE?");
clueButton.setFont(TabbedQuiz.getDefaultFont().deriveFont(40));
clueButton.addMouseListener(this);
clueButton.setBounds(15, 104, 244, 55);
add(clueButton);
multiButton = new JButton("MULTIPLE CHOICE?");
multiButton.setFont(TabbedQuiz.getDefaultFont().deriveFont(20));
multiButton.addMouseListener(this);
multiButton.setBounds(15, 195, 244, 55);
add(multiButton);
answerButton = new JButton("ANSWER!");
answerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
answerButton.setFont(TabbedQuiz.getDefaultFont().deriveFont(40));
answerButton.setBounds(15, 301, 244, 55);
answerButton.addMouseListener(this);
add(answerButton);
backPanel = new JPanel();
backPanel.setBounds(0, 0, 728, 380);
//add(backPanel);
this.setVisible(true);
repaint();
}
@Override
public void mouseClicked(MouseEvent e) {
if ( e.getSource().equals(startButton) ) {
remove(startButton); repaint(); isStarted=true;
startCalendar = Calendar.getInstance();
}
else if ( e.getSource().equals(answerButton) ) offerAnswer();
else if ( e.getSource().equals(clueButton ) ) {
clueArea.setText(clueArea.getText() + qz.getQuestions().get(index).getClueText() + "\n");
aA.setUsedClue(true);
//JOptionPane.showMessageDialog(null, "hi");
}
else if ( e.getSource().equals(multiButton) ) {
String[] answerOptions = qz.getQuestions().get(index).getAnswerOptions(3);
JButton[] optionsButtons = new JButton[4];
for(int j=0;j<4;j++){
optionsButtons[j]=new JButton(answerOptions[j]);
if(optionsButtons[j].getText().length()>13)
optionsButtons[j].setFont(TabbedQuiz.getDefaultFont().deriveFont(10));
else optionsButtons[j].setFont(TabbedQuiz.getDefaultFont().deriveFont(15));
if(j<2) optionsButtons[j].setBounds(295+211*j , 170, 211, 55);
else optionsButtons[j].setBounds(295+211*(j-2) , 226, 211, 55);
optionsButtons[j].addMouseListener(this);
optionsButtons[j].setName("optionsButton"+"["+j+"]");
add(optionsButtons[j]);
repaint();
}
aA.setMultipleChoice(true);
}
else if ( ( (JButton) e.getSource() ).getName().startsWith("optionsButton") ) {
String answerOffered = ( (JButton) e.getSource() ).getText();
answerArea.setText(answerOffered);
offerAnswer();
}
}
@Override
public void mouseEntered(MouseEvent e) {
if(e.getSource()!=startButton && e.getSource().getClass().equals( answerButton.getClass()) ){
( (JButton) e.getSource() ).setBackground(Color.green);
}if(index>0 && e.getSource()==startButton) remove(startButton);
}
@Override
public void mouseExited(MouseEvent e) {
if(e.getSource()!=startButton && e.getSource().getClass().equals( answerButton.getClass()) ){
( (JButton) e.getSource() ).setBackground(UIManager.getColor("control"));
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
}
【问题讨论】:
标签: java swing jpanel jbutton jtabbedpane