2012-04-15 13 views
0

下の画像では、2列のJTableが表示されています。in JTable画像間のスペースを削除

更新
**列が非表示になっています。選択された行の後ろにある赤は、デモ目的のためにのみ
背景色は赤
です。 **

各行には2枚の写真があります。

最初の画像は、チェックボックスのように見えるpng画像です。友人の名前が書かれたpng画像が
に続きます。

イメージは1つのイメージのように表示されますが、スペースがあります。

このスペースを削除することはできますか?
画像に空白が含まれていません

おそらくJTableを使用できません。
その場合、他のスイング「リスト」がこれを行うことができます。

テーブル

 jTableSpriidFriends = new JTable(); 
     jTableSpriidFriends.setRowMargin(0); 
     jTableSpriidFriends.setIntercellSpacing(new Dimension(0, 0)); 
     jTableSpriidFriends.setShowHorizontalLines(false); 
     jTableSpriidFriends.setShowVerticalLines(false); 
     jTableSpriidFriends.setShowGrid(false); 
     m_adapterSpriidFriends = new AbstractTableModelJTableSpriidFriends(); 
     rendererSpriidFriends = new CellRendererJtableSpriidFriends(); 
     jTableSpriidFriends.setModel(m_adapterSpriidFriends); 
     jTableSpriidFriends.setDefaultRenderer(ImageIcon.class, 
rendererSpriidFriends); 
     jTableSpriidFriends.setRowSelectionAllowed(true); 
     jTableSpriidFriends.addMouseListener(this); 
     jTableSpriidFriends.getSelectionModel().addListSelectionListener(this); 
     jTableSpriidFriends.setTableHeader(null); 

     scrollPaneSpriidFriends = new JScrollPane(); 
     scrollPaneSpriidFriends.setBounds(11, 55, 176, 264); 
     panelSpriid.add(scrollPaneSpriidFriends); 
     scrollPaneSpriidFriends.setViewportView(jTableSpriidFriends); 

    for (int i=0; i<m_adapterSpriidFriends.getColumnCount(); i++) { 
     TableColumn column = jTableSpriidFriends.getColumnModel().getColumn(i); 
     if (i==0) column.setPreferredWidth(50); 
     if (i==1) column.setPreferredWidth(120); 

    } 

を作成するコードここDefaultTableCellRenderer

case 0:// type 

    if(friend.selected){ 
     image = new ImageIcon(getClass().getResource 
     ("/resources/friendlist/checkbox_checked.png")).getImage(); 
     this.setIcon(new ImageIcon(image)); 
    }else{ 
     image = new ImageIcon(getClass().getResource("/resources 
     /friendlist/checkbox_unchecked.png")).getImage(); 
     this.setIcon(new ImageIcon(image)); 
    } 

    break; 
case 1:// files 

    BufferedImage old = null; 
    try { 

     if(friend.deviceType.equals(Consts.DEVICE_TYPE_DEVICE)) 
     old = ImageIO.read(getClass().getResource 
     ("/resources/friendlist/row_with_device.png")); 
      else 
     old = ImageIO.read(getClass().getResource 
     ("/resources/friendlist/row_with_pc.png")); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

     int w = old.getWidth(); 
     int h = old.getHeight(); 
     BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

     Graphics2D g2d = img.createGraphics(); 
     g2d.drawImage(old, 0, 0, null); 
     g2d.setPaint(Color.WHITE); 
     //g2d.setFont(new Font("Serif", Font.BOLD, 20)); 

     String s = friend.name; 
     FontMetrics fm = g2d.getFontMetrics(); 
     int x = 10 ; 
     int y = 20; 
     g2d.drawString(s, x, y); 
     g2d.dispose(); 


    this.setIcon(new ImageIcon(img)); 
    break;    
} 

enter image description here

+0

あなたは 'myTable.setShowVerticalLines(false);'を試したことがありますか? 'JTable.setIntercellSpacing(Dimension intercellSpacing)'もチェックしてください。 – Torious

+0

setShowVerticalLinesはすでにfalseに設定されていますが、setIntercellSpacingは忘れています。 setIntercellSpacing(新しい次元(0、0))を設定します。 ....違いはありません。 – Erik

+1

あなたの質問をすぐに[SSCCE](http://sscce.org/)で編集してください。アイコンの場合は 'UIManager.getIcon(" OptionPane.questionIcon ")' – mKorbel

答えて

3

たぶん、あなただけのカスタムレンダラとするJListを使用することができます。レンダラは、派手なフレンドオブジェクトを取得し、GridLayoutを使用した単純なJPanelを使用して適切なラベルを作成します。

+0

JListには2つの列がありますか? – Erik

+0

技術的には、しかし、レンダラーの2つの列のように見えるようにすることができます。 –

+0

はJListでうまく動作します。チェック・イメージをトータルに削除し、2つの大きなイメージを使用しました。 – Erik

3

は、デフォルトのセルレンダリングは、JLabelのを拡張し、セルを表示するための成分として、それ自体を使用します。 JLabelのアイコンとテキストの間には隙間があります。たぶんそれは原因である:

また
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { 

    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     Component comp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     if (comp instanceof JLabel) { 
      JLabel label = (JLabel)comp; 
      label.setIconTextGap(0); 
     } 
     return comp; 
    } 

}); 

table.setDefaultRenderer(ImageIcon.class, new DefaultTableCellRenderer() { 
    { 
     setIconTextGap(0); 
    } 
}); 
+0

興味があります。AbstractTableModelの私のgetColumnClass()がImageIcon.classを返しています。 – Erik

+0

getTableCellRendererComponentから何か他のものを返すことができますか?このメソッドはthis.setText( "");で終了します。 ... – Erik

+0

1つのコンポーネントが複数のセルに再利用されていることを認識するとよいでしょう。テキストと色としてのプロパティは毎回設定されます。同様に行うべきですが、コンポーネントは無関係です。私の答えのコードについては、私は代替案を提示します。 –

関連する問題