0

この回答のコードを使用してログ機能を提供していますが、うまく機能します! ありがとうグスタフ。

さまざまな場所から Swing JTextArea にメッセージを送信する

このアプローチを使用して、次の関数を追加したいと考えています。つまり、「表示」をクリックして、この単語ペアのリストを JText エレメントに書き込みます。

gustafc のコードに少し追加します。

インターフェース:

package com.example.logging;
public interface SimpleActivityLogger {
    void logAction(String message);
    void writeEntry(String s1); //*** I added this ***
}

gustafcの例に従って、それを別のクラスに渡します。

public class SimpleComponentLogger implements SimpleActivityLogger{
    private JTextComponent target;
    private ArrayList data;

    public SimpleComponentLogger(JTextComponent target, ArrayList data){
        this.target = target;
        this.data = data;
    }

    public void logAction(final String message){
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                target.setText(String.format("%s%s%n", new Object[]{target.getText(), message}));
            }
        });
    }

    public void writeEntry(String s1){
        data.add(s1);
        System.out.println("data array length: " + data.size());
    }
}

そして実装を行います:

// this originally extended NotesThread, 
// but I assume you won't have that on your system
public class LookupIterator3 extends Thread {
private SimpleActivityLogger logger;

// Constructor that passes logger instance
public LookupIterator3(SimpleActivityLogger logger){
    this.logger = logger;
}

public void doLookup(){
    this.start();
}

public void run()  {
    String[] words = {"the", "quick", "smart", "fox", "jumps", "over", "the", "lazy", "dog"};
    for(int i=0; i<words.length; i++){
        synchronized(words){
        try{
            logger.logAction(words[i]);
            words.wait(500);
        }
        catch(InterruptedException ie){ie.printStackTrace();}
        }
        logger.writeEntry(words[i]);
    }
}
}

ただし、swing から ArrayList にアクセスしようとすると、size()=0 が返されます。これはスイングの大部分ですが、コピーして貼り付けるだけでよいはずです。

public class MySwingTest extends JFrame {
    private static final long serialVersionUID = 1L;
    private JTextField filename = new JTextField();
    private JTextField dir = new JTextField();

    private JTextPane output, answersPane;
    private JScrollPane scroller;
    private SimpleComponentLogger logger;
    private ArrayList answer;

    public MySwingTest() {
  JMenu fileMenu;
  JMenuBar menuBar;
  JMenuItem menuOpen, menuExit;

  JButton answerButton = new JButton("show answers");
  answerButton.addActionListener(new MyListener());

  menuBar = new JMenuBar();
  fileMenu = new JMenu("File");
  menuBar.add(fileMenu);
  menuOpen = new JMenuItem("open file");
  menuExit = new JMenuItem("exit");

  answer = new ArrayList();
  output = new JTextPane();
  logger = new SimpleComponentLogger(output, answer);
  scroller = new JScrollPane(output, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, 
                  JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  output.setEditable(false);
  answer = new ArrayList();
  answersPane = new JTextPane();
  answersPane.setSize(100, 200);
  answersPane.setEditable(false);

  fileMenu.add(menuOpen);
  fileMenu.add(menuExit);

  menuOpen.addActionListener(new MyListener());
  menuExit.addActionListener(new MyListener());

  JPanel p = new JPanel();
  p.setLayout(new GridLayout(2, 1));
  p.add(filename);
  p.add(dir);

  Container cp = getContentPane();
  cp.add(menuBar,BorderLayout.NORTH);
  cp.add(p);
  cp.add(scroller, BorderLayout.CENTER);
  cp.add(answersPane, BorderLayout.WEST);
  cp.add(answerButton, BorderLayout.SOUTH);

  dir.setEditable(false);
    filename.setEditable(false);
}

// Inner class listener  
class MyListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
            String eventCommand = e.getActionCommand();
            if(eventCommand.equals("exit")){
                System.exit(0);
            }
            if(eventCommand.equals("show answers")){
                String entry = (String)answer.get(0);
                answersPane.setText(entry);         
            }
            else {
                LookupIterator3 lu3 = new LookupIterator3(logger);
                lu3.doLookup();
            }
        }
    }

    public static void main(String[] args) {
        run(new MySwingTest(), 450, 600);
    }

    public static void run(JFrame frame, int width, int height) {
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(width, height);
        frame.setVisible(true);
    }
}

長い質問で申し訳ありませんが、これは私の頭を悩ませています! 助言がありますか?(長いqnを書くとぼろぼろになることはわかっていますが、何を省略できたのかわかりません)

わかった。ロング編集完了。その赤ちゃんを開き、メニューから「ファイルを開く」を選択します。ファイルチューザーなしで実行されます。

4

1 に答える 1

1

問題は実際には非常に単純です。MySwingTestコンストラクターには次の行が 2つあります。

answer = new ArrayList();

ロガーを作成する前に 1 回、作成後に 1 回。2 番目の呼び出しをドロップするだけで、正常に動作するはずです。

注: インスタンス間で ArrayList を共有するのは本当に悪い習慣です (責任は複数のクラスに分散されます)。ロガーが独自の ArrayList を直接作成し、getter を使用してアクセスできるようにするだけであれば、はるかに簡単になります。さらに良いことに、含まれているオブジェクトへのアクセスを直接提供できます (他のインスタンスが ArrayList の内容を変更する可能性を防ぎます)。

注 2: クラス宣言よりもインターフェイス宣言を使用することを検討してください。カップリングを減らすためにList代わりに使用してください。ArrayList

注 3: コレクションを次のように入力することを強くお勧めします。List<String> answer = new ArrayList<String>();

于 2012-09-11T07:53:21.887 に答える