2012-08-07 93 views
0

我提供了一些示例代碼着色行

import java.awt.Color; 
import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

public class TestTable extends javax.swing.JFrame 
{ 
private JButton jButton1; 
private JScrollPane jScrollPane1; 
private JTable jTable1; 

public TestTable() 
{ 
    initComponents(); 
} 

private void initComponents(){ 

    /////////////////////////////////////////////// 
    //Initializing components 
    jScrollPane1 = new javax.swing.JScrollPane(); 
    jTable1 = new javax.swing.JTable(); 
    jButton1 = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    String data[][] = { {"A","B","C"}, 
         {"R","S","T"}, 
         {"U","V","W"} 
         }; 
    String col[] = {"X","Y","Z"}; 
    jTable1 = new JTable(new DefaultTableModel(data, col)); 
    jScrollPane1.setViewportView(jTable1); 

    jButton1.setText("jButton1"); 

    /////////////////////////////////////////////// 
    //positioning button and table 
    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap(15, Short.MAX_VALUE) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375,  javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addContainerGap()) 
       .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
        .addComponent(jButton1) 
        .addGap(160, 160, 160)))) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap() 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 117,  javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(47, 47, 47) 
      .addComponent(jButton1) 
      .addContainerGap(102, Short.MAX_VALUE)) 
    ); 

    /////////////////////////////////////////////// 
    //create event callback for the button 
    jButton1.setText("Change data & color"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    /////////////////////////////////////////////// 
    pack(); 
} 


private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 

    //change the data in the table 
    String data[][] = { {"a","b","c"}, 
         {"r","s","t"}, 
         {"u","v","w"} }; 
    String col[] = {"x","y","z"}; 
    DefaultTableModel model= new DefaultTableModel(data,col); 
    jTable1.setModel(model); 

    //change the header in the table 
    jTable1.getTableHeader().setBackground(Color.red); 

    // IS IT POSSIBLE TO INSERT CODE HERE, WITHOUT REINITIALIZING jTable1, 
    // SO THAT CLICKING THE BUTTON WILL TURN THE MIDDLE ROW GREEN? 


    //change button text 
    jButton1.setText("Changed"); 
} 


public static void main(String[] args) 
{ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
      new TestTable().setVisible(true); 
     } 
    }); 

} 

} 

我已經能夠改變,當我在主運行TestTable的行的顏色澄清我剛纔的問題,但我在更改回調中的行顏色時遇到問題(如上所述)。我的猜測是,插入代碼像

jTable1.getCellRenderer(0, 0).getTableCellRendererComponent(jTable1, String.class, false,false,  0,0).setBackground(Color.green); 

因爲我在此代碼指定表的條目(0,0),我希望這個代碼會變成條目(0,0),但是,這種轉整桌綠色!請注意,我可以更改模型中的數據和標題的顏色,而不會有任何問題。

任何幫助真誠讚賞。 感謝 克里斯

回答

0

使用TableCellRenderer仍然是你與你的更新問題想要什麼,甚至(如@Ryan說的)。你只是想要放入一些特殊的代碼來指明你想要特別着色的行。這裏有一個例子(使用你的測試代碼):

import java.awt.Color; 
import java.awt.Component; 
import java.util.HashMap; 

import javax.swing.*; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 

public class TestTable extends javax.swing.JFrame 
{ 
    private JButton jButton1; 
    private JScrollPane jScrollPane1; 
    private JTable jTable1; 
    private CustomRenderer renderer; 

    public TestTable() 
    { 
     initComponents(); 
    } 

    private void initComponents(){ 

     /////////////////////////////////////////////// 
     //Initializing components 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jTable1 = new javax.swing.JTable(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     String data[][] = { {"A","B","C"}, 
       {"R","S","T"}, 
       {"U","V","W"} 
     }; 
     String col[] = {"X","Y","Z"}; 
     jTable1 = new JTable(new DefaultTableModel(data, col)); 
     //Setup Renderer 
     renderer = new CustomRenderer(); 
     //Add Renderer to table 
     jTable1.getColumnModel().getColumn(0).setCellRenderer(renderer); 
     jTable1.getColumnModel().getColumn(1).setCellRenderer(renderer); 
     jTable1.getColumnModel().getColumn(2).setCellRenderer(renderer); 

     jScrollPane1.setViewportView(jTable1); 

     jButton1.setText("jButton1"); 

     /////////////////////////////////////////////// 
     //positioning button and table 
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
         .addContainerGap(15, Short.MAX_VALUE) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
           .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 375,  javax.swing.GroupLayout.PREFERRED_SIZE) 
             .addContainerGap()) 
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
               .addComponent(jButton1) 
               .addGap(160, 160, 160)))) 
     ); 
     layout.setVerticalGroup(
       layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
         .addContainerGap() 
         .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 117,  javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(47, 47, 47) 
         .addComponent(jButton1) 
         .addContainerGap(102, Short.MAX_VALUE)) 
     ); 

     /////////////////////////////////////////////// 
     //create event callback for the button 
     jButton1.setText("Change data & color"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     /////////////////////////////////////////////// 
     pack(); 
    } 


    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 



     DefaultTableModel model= (DefaultTableModel)jTable1.getModel(); 
     //change the data in the table 
     String data[][] = { {"a","b","c"}, 
       {"r","s","t"}, 
       {"u","v","w"} }; 
     String col[] = {"x","y","z"}; 
     model.setDataVector(data, col); 

     // Necessary to re-add listener (because we're creating new columns) 
     jTable1.getColumnModel().getColumn(0).setCellRenderer(renderer); 
     jTable1.getColumnModel().getColumn(1).setCellRenderer(renderer); 
     jTable1.getColumnModel().getColumn(2).setCellRenderer(renderer); 

     //change the header in the table 
     jTable1.getTableHeader().setBackground(Color.red); 


     // IS IT POSSIBLE TO INSERT CODE HERE, WITHOUT REINITIALIZING jTable1, 
     // SO THAT CLICKING THE BUTTON WILL TURN THE MIDDLE ROW GREEN? 
     renderer.colorModel.put(1, Color.green); //Yes 

     //change button text 
     jButton1.setText("Changed"); 
    } 


    public static void main(String[] args) 
    { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new TestTable().setVisible(true); 
      } 
     }); 

    } 

    //Custom Renderer - does the default rendering except if told the row should be a different color 
    public static class CustomRenderer extends DefaultTableCellRenderer{ 

     //Stores what color you want for rows 
     public HashMap<Integer, Color> colorModel = new HashMap<Integer, Color>(); 

     @Override 
     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 
      //Default Rendering 
      Component result = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

      //Change color of background (If necessary) 
      if(colorModel.get(row) != null){ 
       setBackground(colorModel.get(row)); 
      } else if(!isSelected){ 
       setBackground(null); 
      } 
      return result; 
     } 

    } 
} 
2
  • 更新TableModel,不創建一個新的JTable,那麼你必須添加RendererJTable

  • 更新必須在Event Dispatch Thread完成,否則任何更改將不可見在GUI中你得到Exception from RepaintManager

  • 所有的變化從DefaultTableModelJTables view是自動完成的,使用prepareRenderer應重繪的所有行也

+0

喜行,我很清楚自己的第一點 - 你能解釋一下請給我? - 我正在使用jTable1.setModel(newModel)更新我的方法中的表模型。你說渲染器必須添加到新的JTable中,但是這不是我們想要避免的(即新的JTable)嗎?我也很困惑,因爲在句子的第一部分,你說不要創建一個新的JTable。我想從我的菜單回調中更改jTable1中不同行的背景顏色。謝謝 – 2012-08-07 15:56:08

+0

JTable,它的Model和prepareRenderer應該創建一次,只有 – mKorbel 2012-08-07 16:09:57

4

這裏是你如何可以結合兩種顏色列和行顏色的例子。您基本上在TableCellRenderer中執行測試以查看背景是否應該是一種顏色或另一種顏色。

import java.awt.Color; 
import java.awt.Component; 
import java.util.Enumeration; 
import java.util.Vector; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.SwingUtilities; 
import javax.swing.table.DefaultTableCellRenderer; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 

public class TestTable { 

    public class MyTableCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer { 
    @Override 
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { 
     setBackground(null); 
     super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 
     setText(String.valueOf(value)); 
     boolean interestingRow = row % 5 == 2; 
     boolean secondColumn = column == 1; 
     if (interestingRow && secondColumn) { 
      setBackground(Color.ORANGE); 
     } else if (interestingRow) { 
      setBackground(Color.YELLOW); 
     } else if (secondColumn) { 
      setBackground(Color.RED); 
     } 
     return this; 
    } 

} 

private JFrame f; 
private JTable table; 

protected void initUI() { 
    Vector<Vector<Object>> data = new Vector<Vector<Object>>(); 
    Vector<String> columNames = new Vector<String>(); 
    columNames.add("Col 0"); 
    columNames.add("Col 1"); 
    columNames.add("Col 2"); 
    for (int i = 0; i < 20; i++) { 
     Vector<Object> v = new Vector<Object>(); 
     v.add(i % 3 == 0 ? "Hello" : "World"); 
     v.add("Some data in row " + (i + 1)); 
     v.add("Some other data in row " + (i + 1)); 
     data.add(v); 
    } 
    table = new JTable(new DefaultTableModel(data, columNames)); 
    Enumeration<TableColumn> en = table.getColumnModel().getColumns(); 
    while (en.hasMoreElements()) { 
     TableColumn tc = en.nextElement(); 
     tc.setCellRenderer(new MyTableCellRenderer()); 
    } 
    f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setLocationRelativeTo(null); 
    f.add(new JScrollPane(table)); 
    f.pack(); 
    f.setVisible(true); 

} 

public static void main(String[] args) { 

    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      new TestTable().initUI(); 
     } 
    }); 
} 

}

+0

好的sscce!偷走我的雷! +1 – 2012-08-07 16:24:06

+0

謝謝你。我想我已經能夠創建類似於此的類似的成功代碼。我遇到的問題是使用已經初始化的jTable從回調中渲染。我編輯了我的原始查詢並創建了一些示例代碼,這些代碼是完整的,除了應該放入回調的代碼之外。如果您有任何進一步的想法並且願意分享,我將不勝感激。再次感謝。 – 2012-08-07 19:40:22

+0

你可以在桌上設置一個新的渲染器嗎? – Dodd10x 2012-08-07 20:16:56

0

謝謝尼克。

通過方法掃描後,我發現一個簡單的方法來突出我想通過選擇然後將它們上色選擇

jTable1.setRowSelectionInterval(0, 1); 
    jTable1.setSelectionBackground(Color.black); 
+0

我想這可能適用於你的情況 - 只要你不介意用戶將來的選擇將會改變表格的顏色。找到自己的問題的答案是值得自豪的 - 恭喜! – 2012-08-08 15:17:43