2012-04-15 9 views
0

In der folgenden Abbildung sehen Sie eine JTable mit zwei Spalten.in JTable Abstand zwischen Bildern entfernen

UPDATE
** Die Spalten sind ausgeblendet. Das Rot hinter der ausgewählten Zeile ist
Hintergrundfarbe rot nur für Demonstrationszwecke
. **

Jede Zeile hat zwei Bilder.

Das erste Bild ist ein PNG-Bild, das wie ein Kontrollkästchen aussieht. Gefolgt von
ein PNG-Bild, auf dem der Name des Freundes geschrieben wird.

Die Bilder sollten wie ein Bild aussehen, aber es gibt ein Leerzeichen.

Ist es möglich, diesen Raum zu entfernen?
Die Bilder haben nicht den Raum

Vielleicht ist es nicht möglich mit JTable.
In diesem Fall, was andere Swing "Liste" kann dies tun.

Der Code, der die Tabelle

 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); 

    } 

hier die 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

Haben Sie versucht, 'myTable.setShowVerticalLines (false);'? Überprüfen Sie auch 'JTable.setIntercellSpacing (Dimension intercellSpacing)'. – Torious

+0

Die setShowVerticalLines wurde bereits auf false gesetzt, aber der setIntercellSpacing wurde vergessen. setIntercellSpacing (neue Dimension (0, 0)); .... macht keinen Unterschied. – Erik

+1

für bessere Hilfe schneller bearbeiten Sie Ihre Frage mit einem [SSCCE] (http://sscce.org/), für Symbole können Sie einfach verwenden 'UIManager.getIcon (" OptionPane.questionIcon ")' – mKorbel

Antwort

3

Vielleicht können Sie nur einen JList mit benutzerdefinierten Renderer verwenden. Der Renderer würde dann die spriid friend -Objekte nehmen und entsprechende Labels unter Verwendung eines einfachen JPanel mit GridLayout konstruieren.

+0

kann JList zwei Spalten haben? – Erik

+0

Technisch, nein. Aber Sie können es wie zwei Spalten im Renderer aussehen lassen. –

+0

funktioniert gut mit JList. das Scheckbild vollständig entfernt und zwei große Bilder verwendet, eins mit Scheck und eins ohne. – Erik

3

Der Standardzellen Renderer JLabel erstreckt, und verwendet, um sich als Komponente erzeugt die Zelle anzuzeigen. Ein JLabel hat Symbol und Text mit einer Lücke dazwischen. Vielleicht ist die Ursache:

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; 
    } 

}); 

Alternativ:

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

interessant wird einige testen .. Meine getColumnClass() in der AbstractTableModel gibt ImageIcon.class zurück – Erik

+0

könnte ich etwas anderes aus der GetTableCellRendererComponent und wie? Die Methode endet mit this.setText (""); ... – Erik

+0

Es ist gut zu erkennen, dass eine einzelne Komponente für mehr als eine Zelle wiederverwendet wird; Daher werden Eigenschaften wie Text und Farbe jedes Mal neu gesetzt. Sie sollten dies ebenfalls tun, aber die Komponente ist irrelevant. Für den Code in meiner Antwort werde ich eine Alternative geben. –