JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
作者 監聽的發生事件是在表單上產生label
sheephea





發文: 3
積分: 0
於 2009-06-03 00:42 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
麻煩耐心看一下解說 =.=

首先稍微講解一下我的問題...
我有個JMenuItem的功能是去讀一個文字檔
文字檔每一行會存成一個物件 (一行是一組完整的選擇題包括答案題目選項)
而在每一行用斜線區隔的地方就會存成物件的不同屬性
也就是說 如果有五行就會產生五個物件

產生的部分我沒有問題
不過在顯示的時候我遇到問題
我希望讀出檔案之後可以直接變成一份完整的考卷(而不是一題寫完按下一題)
用捲軸捲動進行下面一題的作答

//---------------------------------------------
我的想法是先做出畫面
然後監聽的事件去依照物件數量利用回圈作出JLabel等等組件然後放到一個JPanel上
再加到主要的JPanel中
但當然是不可行的了....

請大家看一下我的程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
 
class dododod {
 
    public static void main(String[] args) {
        new mainFrame().go();
    }
}
 
class mainFrame {
//靜態成員------------------------------------------
    JFrame frame;
    JPanel mainpanel;
    JPanel exampanel;
    JScrollPane examscrollpane;
    ArrayList<question> QuizList = new ArrayList<question>();
    ArrayList<JLabel> labelList = new ArrayList<JLabel>();
//產生畫面-------------------------------------------
    public void go() {
 
        frame = new JFrame("try it skin?");
        mainpanel = new JPanel();
        exampanel = new JPanel();
 
        examscrollpane = new JScrollPane(exampanel);
 
        mainpanel.setLayout(new BoxLayout(mainpanel, BoxLayout.Y_AXIS));
 
        //toolbar setup---------------------------------------------------------這幾行不重要
        JMenuBar jmenubar = new JMenuBar();
        JMenu jmenufile = new JMenu("File");
        JMenuItem openfile = new JMenuItem("Openfile");
        JMenuItem exit = new JMenuItem("Exit");
        jmenufile.add(openfile);
        jmenufile.add(exit);
        jmenubar.add(jmenufile);
 
        mainpanel.add(examscrollpane);
 
        openfile.addActionListener(new openfilelistener());//此程式的唯一監聽事件
        //frame add something---------------------------------------------------
        frame.setJMenuBar(jmenubar);
        frame.add(mainpanel);
 
        //frame set up-----------------------------------------------------------
        frame.getContentPane();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 800, 600);
        frame.setVisible(true);
    }
 
    class openfilelistener implements ActionListener {
 
        public void actionPerformed(ActionEvent e) {
            JFileChooser fileOpen = new JFileChooser();
            fileOpen.showOpenDialog(frame);
            loadFile(fileOpen.getSelectedFile());
        }
    }
 
    public void loadFile(File file) {
 
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String line = null;
            while ((line = reader.readLine()) != null) {
                makeQuiz(line);
            }
            reader.close();
        } catch (Exception ex) {
            System.out.println("couldn't read the card file");
            ex.printStackTrace();
        }
        showQuiz();
 
    }
//把讀到的檔案每一行都變成物件---------------------------------------------------
    public void makeQuiz(String lineToParse) {
        String[] AQuiz = lineToParse.split("/");
        System.out.println(AQuiz[2]);
        QuizList.add(new question(AQuiz[0], AQuiz[1], AQuiz[2], AQuiz[3], AQuiz[4], AQuiz[5], AQuiz[6]));
    }
 
        public void showQuiz() {
 
        for (int i = 0; i < QuizList.size(); i++) { //我想要依照題目的數量來增加東西在主要panel上
 
            }
 
    }
}
 


希望可以得到解答 謝謝


reply to postreply to post
作者 Re:監聽的發生事件是在表單上產生label [Re:sheephea]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2009-06-03 00:54 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
sheephea wrote:
麻煩耐心看一下解說 =.=

首先稍微講解一下我的問題...
我有個JMenuItem的功能是去讀一個文字檔
文字檔每一行會存成一個物件 (一行是一組完整的選擇題包括答案題目選項)
而在每一行用斜線區隔的地方就會存成物件的不同屬性
也就是說 如果有五行就會產生五個物件

產生的部分我沒有問題
不過在顯示的時候我遇到問題
我希望讀出檔案之後可以直接變成一份完整的考卷(而不是一題寫完按下一題)
用捲軸捲動進行下面一題的作答

//---------------------------------------------
我的想法是先做出畫面
然後監聽的事件去依照物件數量利用回圈作出JLabel等等組件然後放到一個JPanel上
再加到主要的JPanel中
但當然是不可行的了....


怎麼說【當然是不可行的】?!

如果你不能提供完整的程式碼,那麼就請你把程式簡化到可以點出問題點(遇到困難之處)且完整的程度。
程式碼涵蓋範圍太廣會失去焦點(因為有時要解決一個問題會等於是一次同時解決許多問題)。

以提供的程式架構來看,假設你已經做好給定一個 question object 來 build 出一個完整個問答 panel,那麼大致上來說,你只要拿出 QuizList 裡所有的 question 一一 build 出問答 panel,並將問答 panel 一一放進 exampanel 裡,再 revalidate exampanel。exampanel 可能使用垂直的 BoxLayout 就可以得到你要的版面(當然這得看你的問答 panel 如何設計與正確與否而定)。


Duncan edited on 2009-06-03 01:03
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:監聽的發生事件是在表單上產生label [Re:Duncan]
Duncan

還隱隱作痛

版主

發文: 7816
積分: 39
於 2009-06-03 17:20 user profilesend a private message to usersend email to Duncanreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Duncan wrote:
怎麼說【當然是不可行的】?!

如果你不能提供完整的程式碼,那麼就請你把程式簡化到可以點出問題點(遇到困難之處)且完整的程度。
程式碼涵蓋範圍太廣會失去焦點(因為有時要解決一個問題會等於是一次同時解決許多問題)。

以提供的程式架構來看,假設你已經做好給定一個 question object 來 build 出一個完整個問答 panel,那麼大致上來說,你只要拿出 QuizList 裡所有的 question 一一 build 出問答 panel,並將問答 panel 一一放進 exampanel 裡,再 revalidate exampanel。exampanel 可能使用垂直的 BoxLayout 就可以得到你要的版面(當然這得看你的問答 panel 如何設計與正確與否而定)。


如果看上述的文字還不能了解意思,可以看看我隨手寫的 demo code。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package demo.swing;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.util.LinkedList;
import java.util.List;
 
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
public class SurveyApplication {
  public static void main(String[] args) throws UnsupportedEncodingException {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
 
    final JFrame frm = new JFrame("七八年級青年常識調查問卷");
    frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
    final List<IQuiz<Integer>> allQuiz = parse(new InputStreamReader(SurveyApplication.class.getResourceAsStream("Questions.txt"), "UTF-8"));
 
    Box infoPane = Box.createHorizontalBox();
    JLabel hint = new JLabel("此問卷調查的結果不代表任何意義,請以直覺來作答。");
    hint.setFont(new Font("Dialog", Font.PLAIN, 20));
    hint.setForeground(Color.BLUE);
    infoPane.add(hint);
    infoPane.add(Box.createHorizontalStrut(10));
    final JButton start = new JButton("開始作答");
    infoPane.add(start);
    frm.getContentPane().add(infoPane, BorderLayout.NORTH);
 
    final VerticalStackPanel quizPanel = new VerticalStackPanel();
    frm.getContentPane().add(new JScrollPane(quizPanel));
 
    final JLabel status = new JLabel(" ", JLabel.TRAILING);
    status.setBorder(BorderFactory.createLoweredBevelBorder());
    frm.getContentPane().add(status, BorderLayout.SOUTH);
 
    ActionListener timeCounter = new ActionListener() {
      private int seconds;
 
      @Override
      public void actionPerformed(ActionEvent e) {
        ++seconds;
        status.setText(String.format("作答經過時間: %d 分 %d 秒", seconds / 60, seconds % 60));
      }
    };
    final Timer timer = new Timer(1000, timeCounter);
 
    ChangeListener quizMonitor = new ChangeListener() {
      int answeredQuizCount;
 
      @Override
      public void stateChanged(ChangeEvent e) {
        IQuiz<?> quiz = (IQuiz<?>) e.getSource();
        quiz.getVisualComponent().setEnabled(false);
        if (++answeredQuizCount >= allQuiz.size()) {
          timer.stop();
          status.setText(String.format("%s [作答完成]", status.getText()));
          JOptionPane.showMessageDialog(frm.getContentPane(), "感謝你完成此份問卷。");
        }
      }
    };
    for (IQuiz<Integer> quiz : allQuiz) {
      quiz.addChangeListener(quizMonitor);
    }
    start.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        start.setVisible(false);
        Border lineBorder = BorderFactory.createEtchedBorder(EtchedBorder.RAISED);
        // 把所有問題 panel 加到 quizPanel(問題顯示區)
        int n = 0;
        for (IQuiz<Integer> quiz : allQuiz) {
          JComponent quizBlock = quiz.getVisualComponent();
          quizBlock.setBorder(BorderFactory.createTitledBorder(lineBorder, String.format("問題 %d", ++n)));
          quizPanel.add(quizBlock);
        }
        quizPanel.revalidate();
        quizPanel.requestFocusInWindow();
        timer.start();
      }
    });
    frm.setSize(600, 500);
    frm.setLocationRelativeTo(null);
    frm.setVisible(true);
  }
 
  private static List<IQuiz<Integer>> parse(Reader source) {
    List<IQuiz<Integer>> quizList = new LinkedList<IQuiz<Integer>>();
 
    BufferedReader reader = new BufferedReader(source);
    String line;
    try {
      while ((line = reader.readLine()) != null) {
        String[] tokens = line.split("\\|");
        String[] options = new String[tokens.length - 1];
        System.arraycopy(tokens, 1, options, 0, options.length);
        quizList.add(buildQuizPanel(tokens[0], options));
      }
    }
    catch (IOException e) {
      e.printStackTrace();
    }
    finally {
      try {
        reader.close();
      }
      catch (IOException e) {
        e.printStackTrace();
      }
    }
 
    return quizList;
  }
 
  private static IQuiz<Integer> buildQuizPanel(String question, String... options) {
    return new HtmlQuizPanel(question, options);
  }
}


*執行附件中的 demo executable jar 需要 JRE 1.6+。完整 source code 可以在這裡下載(文字檔使用 UTF-8 編碼)。

OrzQuiz.jar (20.38k)


Duncan edited on 2009-06-03 17:51
reply to postreply to post

給我
辣味豆腐 其餘免談
作者 Re:監聽的發生事件是在表單上產生label [Re:Duncan]
sheephea





發文: 3
積分: 0
於 2009-06-03 23:00 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
恩 謝謝版主的幫忙
我說"當然不行"的意思是說我當然是沒弄成功才會上來po文
版主所寫的功能的確就是我要的東西 謝謝
實在太鬼了


reply to postreply to post
作者 Re:監聽的發生事件是在表單上產生label [Re:Duncan]
sheephea





發文: 3
積分: 0
於 2009-06-04 00:04 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
版主大大!我成功了喔
我的確是缺少了下面的這行程式碼的相關細節導致錯誤

quizPanel.revalidate();

謝謝

-------------
此外您的範例對我很有幫助 再次謝謝


reply to postreply to post
» JWorld@TW »  Java 新手區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8