0

下の図ではJTable、2 つの列を持つ が表示されています。

更新
**列は非表示です。選択した行の後ろの
赤は、デモンストレーションのみを目的として背景色が赤
になっています。**

各行には 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;              
}

ここに画像の説明を入力

4

2 に答える 2

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);
    }
});
于 2012-04-15T22:19:27.240 に答える
3

JList をカスタム レンダラーで使用することもできます。次に、レンダラーは spriid フレンド オブジェクトを取得し、GridLayout を備えた単純な JPanel を使用して適切なラベルを作成します。

于 2012-04-15T22:53:19.660 に答える