TwitterClient2

久々のブログ更新です。
色々あって更新できませんでした。
さぁプログラムだ。

regeek TwitterClientのパワーアップ

今回追加した機能は、JTableによるアイコン表示です。
Twitterクライアントにはかかせない画像表示の機能をなんとかつけたかったので頑張りました。

TimeLine.java

import twitter4j.*;
import javax.swing.*;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableModel;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeLine implements ActionListener {
	
	Twitter twitter;
	JPanel timeLinePanel;
	JPanel updatePanel;
	JTextField updateField;
	JButton updateButton;
	
	JLabel iconLabel;
	ImageIcon icon;
	JTable table;
	
	public TimeLine(Twitter twitter) throws TwitterException{
		
   this.twitter = twitter;
   timeLinePanel = new JPanel();
   updateField = new JTextField();

   updatePanel = new JPanel(new FlowLayout());
   updatePanel.setSize(600, 30);
   updatePanel.setPreferredSize(new Dimension(600, 30));
   updatePanel.setMaximumSize(new Dimension(600, 30));

   updateButton = new JButton("Update");
   updateButton.setSize(90, 20);
   updateButton.setPreferredSize(new Dimension(90, 20));
   updateButton.setMaximumSize(new Dimension(90, 20));
   updateButton.addActionListener(this);
   
   updateField = new JTextField();
   updateField.setSize(400, 20);
   updateField.setPreferredSize(new Dimension(400, 20));
   updateField.setMaximumSize(new Dimension(400, 20));

   updatePanel.add(updateField);
   updatePanel.add(updateButton);
   timeLinePanel.add(updatePanel);
   updateTimePanel();
	    
	}
	
	private void updateTimePanel() throws TwitterException {
   java.util.List<Status> statusList = twitter.getFriendsTimeline();

   Object statusArr[][] = new Object [statusList.size()][2];
   timeLinePanel.setLayout(new BoxLayout(timeLinePanel, BoxLayout.Y_AXIS));

   for (int i = 0; i < statusList.size(); i++) {
	    	statusArr[i][0] = new ImageIcon(statusList.get(i).getUser().getProfileImageURL());
	    	Date tweetDate = statusList.get(i).getCreatedAt();
	    	SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy HH:mm");
	    	statusArr[i][1] =  statusList.get(i).getUser().getName() + statusList.get(i).getText() + "-" + formatter.format(tweetDate);
	    }

	    Object columnName[] = {"icon","text"};
	    
	    DefaultTableModel statusTable = new MyTableModel(statusArr,columnName);
	    JTable table = new JTable(statusTable);
	    
	    //列幅の指定
	    DefaultTableColumnModel columnMode = (DefaultTableColumnModel)table.getColumnModel();
	 TableColumn column1 = null;
	 TableColumn column2 = null;
    column1 = columnMode.getColumn(0);
	    column1.setPreferredWidth(150);
	    column2 = columnMode.getColumn(1);
	    column2.setPreferredWidth(850);
	    table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
	    //高さの指定
	    table.setRowHeight(50);
	    
	    JScrollPane scrollPane = new JScrollPane(table);
	    scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
	    
	    timeLinePanel.add(scrollPane);
	  }
	  
	
	  class MyTableModel extends DefaultTableModel{
		  MyTableModel(Object[][] data,Object[] columName){
		    super(data,columName);
		  }

		  public Class getColumnClass(int col){
		    return getValueAt(0, col).getClass();
		  }
		}
	
	  public JPanel getTimeLinePanel() {
		    return timeLinePanel;
	  }
	  
	@Override
	public void actionPerformed(ActionEvent e) {
		try {
		      twitter.updateStatus(updateField.getText());
		      updateTimePanel();
		      timeLinePanel.remove(1);
		      timeLinePanel.updateUI();
		      updateField.setText("");
		    } catch (TwitterException exception) {
		      JOptionPane.showMessageDialog(null, "An error has occurred while updating.");
		    exception.printStackTrace();
		    }
	}
}


今回よくわからなかったのは以下のコード

class MyTableModel extends DefaultTableModel{
 MyTableModel(Object[][] data,Object[] columName){
  super(data,columName);
 }
    
 public Class getColumnClass(int col){
  return getValueAt(0, col).getClass();
 }
}	

このコードがないと画像を表示することができないらしい。
MyTableModelクラスについてはまだ理解出来るが、
getColumnClassクラスがわからない。
MyTableModelクラスの中でgetColumnClassクラスを宣言しているから内部クラスなのだろうか?
getColumnClassクラスの引数、int col にどこで値を渡しているかなどがよく分からない。
まだまだ勉強不足です。

画像

次の課題

Jtableのテキストを折り返すようにする。
折り返さないとみんなのつぶやきが見れないよ><

javaマスターの方がこのブログを見ていたら助けてください!
よろしくお願いします。