2016-05-20 4 views
1

私は、コンクリートの列にイメージを追加し、jTableでrawを追加するというタスクがあります。私はsetCellRenderedで作成しようとしましたが、正しく動作しません。多分誰かが同じ仕事をしていました。 私はDefaultTableCellRendererを介して作成しようとしましたが、現在、このレンダラーを具体的なセルではなく、列ではなく、どのように呼び出すことができないのですか?[3] [4] public Frame1(){ initialize(); }JTable、MousClickによって具体的なセルに動的にlableを追加します。

/** 
* Initialize the contents of the frame. 
*/ 
private void initialize() { 
    frame = new JFrame(); 
    frame.setBounds(100, 100, 364, 385); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().setLayout(null); 

    table = new JTable(); 
    table.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent event) { 
      Point point = event.getPoint(); 
      JTable target = (JTable)event.getSource(); 
      int column = table.columnAtPoint(point); 
      int row = target.getSelectedRow(); 
      table.getColumnModel().getColumn(column).setCellRenderer(new ImageRenderer()); 
      //JOptionPane.showMessageDialog(table, "Column header #" + column + " is clicked"); 
     } 
    }); 
    table.setBorder(new SoftBevelBorder(BevelBorder.LOWERED, Color.DARK_GRAY, Color.LIGHT_GRAY, SystemColor.menu, null)); 
    table.setModel(new DefaultTableModel(
     new Object[][] { 
      {null, "", null, null, null, null}, 
      {null, null, null, null, null, null}, 
      {null, null, null, null, null, null}, 
      {null, null, null, null, null, null}, 
      {null, null, null, null, null, null}, 
      {null, null, null, null, null, null}, 
      {null, null, null, null, null, null}, 
     }, 
     new String[] { 
      "New column", "New column", "New column", "New column", "New column", "New column" 
     } 
    )); 
    table.getColumnModel().getColumn(0).setMinWidth(50); 
    table.setBounds(0, 0, 350, 350); 
    table.setRowHeight(50); 
    frame.getContentPane().add(table); 
} 

}

class ImageRenderer extends DefaultTableCellRenderer { 
    JLabel lbl = new JLabel(); 
    ImageIcon imageIcon = new ImageIcon(new ImageIcon("green-glossy-ball.jpg").getImage().getScaledInstance(50, 50, Image.SCALE_DEFAULT)); 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int column) { 
    lbl.setIcon(imageIcon); 
    return lbl; 
    } 

}

+0

私は、このセルは画像を表示する必要がありますが、私は理解していたが、別のセルを選択した後に画像を表示する必要がありますか? –

+0

はい、私はシンプルプレイを "Connect Four"にする必要があります。私が列をクリックすると、ボールは最初の空きセルまで落ちなければなりません。今、私はテーブルとイベントを扱う方法を理解しようとしています。 – Lena

答えて

0

oracle.comの変更例。選択したセルにアイコンが表示されます。してください、見てください:

/* 
* SimpleTableDemo.java requires no other files. 
*/ 
import java.awt.Component; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.io.IOException; 
import java.net.URL; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.table.DefaultTableCellRenderer; 

public class SimpleTableDemo extends JPanel { 

    private static final String ICON_IMAGE 
      = "http://icons.iconarchive.com/icons/scafer31000/bubble-circle-3/16/GameCenter-icon.png"; 

    public SimpleTableDemo() { 
     super(new GridLayout(1, 0)); 

     String[] columnNames = {"First Name", 
      "Last Name", 
      "Sport", 
      "# of Years", 
      "Vegetarian"}; 

     Object[][] data = { 
      {"Kathy", "Smith", 
       "Snowboarding", new Integer(5), new Boolean(false)}, 
      {"John", "Doe", 
       "Rowing", new Integer(3), new Boolean(true)}, 
      {"Sue", "Black", 
       "Knitting", new Integer(2), new Boolean(false)}, 
      {"Jane", "White", 
       "Speed reading", new Integer(20), new Boolean(true)}, 
      {"Joe", "Brown", 
       "Pool", new Integer(10), new Boolean(false)} 
     }; 

     final JTable table = new JTable(data, columnNames); 
     table.setPreferredScrollableViewportSize(new Dimension(500, 70)); 
     table.setFillsViewportHeight(true); 
     java.awt.Image image = null; 
     try { 
      URL imageLoc = new URL(ICON_IMAGE); 
      image = ImageIO.read(imageLoc); 
     } catch (IOException ex) { 
      Logger.getLogger(SimpleTableDemo.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     final ImageIcon icon = new ImageIcon(image); 
     table.setDefaultRenderer(Object.class, new ImageRenderer(icon)); 
     //Create the scroll pane and add the table to it. 
     JScrollPane scrollPane = new JScrollPane(table); 
     //Add the scroll pane to this panel. 
     add(scrollPane); 
    } 

    /** 
    * Create the GUI and show it. For thread safety, this method should be 
    * invoked from the event-dispatching thread. 
    */ 
    private static void createAndShowGUI() { 
     //Create and set up the window. 
     JFrame frame = new JFrame("SimpleTableDemo"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     //Create and set up the content pane. 
     SimpleTableDemo newContentPane = new SimpleTableDemo(); 
     newContentPane.setOpaque(true); //content panes must be opaque 
     frame.setContentPane(newContentPane); 

     //Display the window. 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private class ImageRenderer extends DefaultTableCellRenderer { 

     private final JLabel lbl = new JLabel(); 
     private final ImageIcon imageIcon; 

     public ImageRenderer(ImageIcon imageIcon) { 
      this.imageIcon = imageIcon; 
      lbl.setIcon(imageIcon); 
     } 

     @Override 
     public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
       boolean hasFocus, int row, int column) { 
      Component result = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
      if (hasFocus && isSelected) { 
       result = lbl; 
      } 
      return result; 
     } 
    } 
} 
+0

ありがとうございました。このコードは非常に便利です! – Lena

+0

カスタムレンダリングの必要はありません。 – camickr

+0

@Lenaよろしくお願いします!それがあなたが探しているものなら、それに投票したり、間違っていればベスト・アンサーとして設定してください。私はそれを変更しようとします –

2

カスタムレンダリングする必要はありません。あなたがする必要がどのような

は次のとおりです。

  1. Class.Iconを返すためにTableModel
  2. オーバーライドにTableModelgetColumnClass(...)方法をIcon追加し、テーブルには、デフォルトのアイコンのレンダラを使用します。

カスタムレンダラーが必要な場合は、Using Custom RenderersのSwingチュートリアルのセクションを参照してください。

table.setBounds(0, 0, 350, 350); 
table.setRowHeight(50); 
frame.getContentPane().add(table); 

ヌルレイアウトを使用しないでください。 setBounds()は使わないでください。 Swingはレイアウトマネージャで使用するように設計されています。列見出しを表示するには、JScrollPaneに表を追加する必要があります。繰り返しますが、このチュートリアルの例では、これを行う方法を説明します。だからチュートリアルを読んでデモコードをダウンロードしてください。

+0

アドバイスありがとう – Lena

+0

@Lena、うれしかったです。チェックマークをクリックして回答を「受け入れる」ことを忘れないでください。そうすれば、問題が解決されたことが人々に分かります。 – camickr

関連する問題