2012-07-23 198 views
1

我已經添加了一個表格,但問題是,面板不顯示其背景顏色。我曾嘗試設置scrollpane背景顏色等,但它不起作用。該框架上有一個「驗證」按鈕,點擊後會在其下方顯示一個表格。在點擊之前,表格將出現的部分是純灰色的。我希望整個部分都是象牙背景。請幫助我診斷問題。更改JTable的背景顏色

try 
{ 
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
    Connection conn1=DriverManager.getConnection("jdbc:odbc:vasantham","",""); 
    Statement st1=conn1.createStatement(); 
    ResultSet rs1=st1.executeQuery("select * from try where DATEDIFF('d',NOW(),exdate) < 61 order by tname"); 
    ResultSetMetaData md1=rs1.getMetaData(); 
    int cols1=md1.getColumnCount(); 
    model1=new DefaultTableModel(); 
    model1.addColumn("Purpose"); 
    model1.addColumn("Name"); 
    model1.addColumn("Composition"); 
    model1.addColumn("Expiry"); 
    model1.addColumn("Stock"); 
    model1.addColumn("Cost"); 
    model1.addColumn("Type"); 
    model1.addColumn("Supplier"); 
    model1.addColumn("Supplier Number"); 
    model1.addColumn("Rack"); 
    table1=new JTable(model1); 
    Color ivory=new Color(255,255,208); 
    table1.setOpaque(false); 
    table1.setBackground(ivory); 
    String[] tabledata1=new String[cols1]; 
    int i=0; 
    while(rs1.next()) 
    { 
     for(i=0;i<cols1;i++) 
     { 
      if(i==3) 
      { 
       Date intr1=(rs1.getDate(i+1)); 
       tabledata1[i]=formatter1.format(intr1); 
      } 
      else 
      tabledata1[i]=rs1.getObject(i+1).toString(); 
     } 
     model1.addRow(tabledata1); 
    } 
    JScrollPane scroll1 = new JScrollPane(table1); 
    scroll1.setBackground(new Color(255,255,208)); 
    scroll1.getViewport().setBackground(ivory); 
    panel1.setLayout(new BorderLayout()); 
    panel1.setBackground(ivory); 
    table1.getTableHeader().setBackground(ivory); 
    panel1.add(scroll1,BorderLayout.CENTER); 
    frame1.add(panel1,BorderLayout.CENTER); 
    conn1.close(); 
} 

Output

+1

完全不相關......避免在事件調度線程上查詢數據庫。請參閱[併發中的Swing](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)以獲取更多信息 – Robin 2012-07-23 05:58:23

+0

@Robin這是一個單獨的方法'addTable'。它必須在actionPerformed中調用。如果不在這裏,先生,我應該把它放在哪裏? – Gomathi 2012-07-23 06:01:44

+0

數據庫查詢應該發生在工作線程上以避免阻塞EDT。例如'SwingWorker'類可以用於 – Robin 2012-07-23 07:38:55

回答

5

滾動窗格含有另一種組分,被稱爲視口。這實際上是將組件分配給滾動窗格的地方。

如果你想保持JTable中爲透明(table1.setOpaque(false);),那麼你需要更改視口背景

scroll1.getViewport().setBackground(ivory); 

否則,表設置爲不透明和table1.setFillsViewportHeight(true);迫使表填滿整個視

修訂

工作正常,我

model1 = new DefaultTableModel(); 
model1.addColumn("Purpose"); 
model1.addColumn("Name"); 
model1.addColumn("Composition"); 
model1.addColumn("Expiry"); 
model1.addColumn("Stock"); 
model1.addColumn("Cost"); 
model1.addColumn("Type"); 
model1.addColumn("Supplier"); 
model1.addColumn("Supplier Number"); 
model1.addColumn("Rack"); 

for (int index = 0; index < 10; index++) { 

    Vector vector = new Vector(); 
    vector.add("p" + index); 
    vector.add("n" + index); 
    vector.add("c" + index); 
    vector.add("e" + index); 
    vector.add("s" + index); 
    vector.add("c" + index); 
    vector.add("t" + index); 
    vector.add("s" + index); 
    vector.add("s" + index); 
    vector.add("r" + index); 

    model1.addRow(vector); 

} 

table1 = new JTable(model1); 
Color ivory = new Color(255, 255, 208); 
table1.setOpaque(true); 
table1.setFillsViewportHeight(true); 
table1.setBackground(ivory); 

JScrollPane scroll1 = new JScrollPane(table1); 
table1.getTableHeader().setBackground(ivory); 
add(scroll1, BorderLayout.CENTER); 

您可以註釋掉行創建部分,它仍然會以象牙繪畫。

+0

正如你所看到的,我已經在程序中使用了你的第一個選項。但它沒有奏效。我現在將表格設置爲不透明並填充視圖端口。主席先生,但這仍然行不通。 – Gomathi 2012-07-23 05:58:36

+0

@Gomathi檢查我的更新。我已經測試過,它對我來說工作得很好 – MadProgrammer 2012-07-23 07:11:50

+0

@Gomathi從你的評論mKorbel,確保幀內容窗格的背景也設置了之前你建立表和你的代碼我認爲'panel1'應該有它的背景在創建表之前設置 – MadProgrammer 2012-07-23 07:17:33

2

爲什麼你的意思不起作用?

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

public class TableCellClass { 

    private JFrame frame = new JFrame("Table Demo"); 
    private String[] columnNames = {"String", "Integer", "Float", "Double", "Locale & Double", "Boolean"}; 
    private Object[][] data = { 
     {"aaa", new Integer(12), new Float(12.15), new Double(100.05), new Double(12.05), true}, 
     {"bbb", new Integer(5), new Float(7.154), new Double(6.1555), new Double(417.55), false}, 
     {"CCC", new Integer(92), new Float(0.1135), new Double(3.1455), new Double(11.05), true}, 
     {"ddd", new Integer(12), new Float(31.15), new Double(10.05), new Double(23.05), true}, 
     {"eee", new Integer(5), new Float(5.154), new Double(16.1555), new Double(17.55), false}, 
     {"fff", new Integer(92), new Float(4.1135), new Double(31.1455), new Double(3.05), true}}; 
    private TableModel model = new DefaultTableModel(data, columnNames) { 

     private static final long serialVersionUID = 1L; 

     @Override 
     public Class<?> getColumnClass(int column) { 
      return getValueAt(0, column).getClass(); 
     } 
    }; 
    private JTable table = new JTable(model); 

    public TableCellClass() { 
     table.setRowHeight(20); 
     //table.setPreferredScrollableViewportSize(table.getPreferredSize()); 
     table.setBackground(Color.red); 
     JScrollPane scroll = new JScrollPane(table); 
     scroll.getViewport().setBackground(Color.blue); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(scroll); 
     frame.pack(); 
     frame.setLocation(150, 150); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TableCellClass tableCellClass = new TableCellClass(); 
      } 
     }); 
    } 
} 

這可能會更好,在這種情況下,你想玩不透明?

import java.awt.*; 
import javax.swing.*; 

public class TableWithTimer { 

    private static final long serialVersionUID = 1L; 
    private JFrame frame = new JFrame(); 
    private JScrollPane scroll = new JScrollPane(); 
    private JTable myTable; 
    private String[] head = {"One", "Two", "Three", "Four", "Five", "Six"}; 
    private String[][] data = new String[25][6]; 

    public TableWithTimer() { 
     myTable = new TableBackroundPaint0(data, head); 
     myTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     myTable.setGridColor(Color.gray); 
     myTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 
     scroll.setViewportView(myTable); 
     frame.add(scroll, BorderLayout.CENTER); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocation(100, 100); 
     frame.pack(); 
     frame.setVisible(true); 
    } 


    public static void main(String args[]) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       TableWithTimer tableWithTimer = new TableWithTimer(); 
      } 
     }); 
    } 
} 

class TableBackroundPaint0 extends JTable { 

    private static final long serialVersionUID = 1L; 

    TableBackroundPaint0(Object[][] data, Object[] head) { 
     super(data, head); 
     setOpaque(false); 
     ((JComponent) getDefaultRenderer(Object.class)).setOpaque(false); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     Color background = new Color(168, 210, 241); 
     Color controlColor = new Color(230, 240, 230); 
     int width = getWidth(); 
     int height = getHeight(); 
     Graphics2D g2 = (Graphics2D) g; 
     Paint oldPaint = g2.getPaint(); 
     g2.setPaint(new GradientPaint(0, 0, background, width, 0, controlColor)); 
     g2.fillRect(0, 0, width, height); 
     g2.setPaint(oldPaint); 
     for (int row : getSelectedRows()) { 
      Rectangle start = getCellRect(row, 0, true); 
      Rectangle end = getCellRect(row, getColumnCount() - 1, true); 
      g2.setPaint(new GradientPaint(start.x, 0, controlColor, (int) ((end.x + end.width - start.x) * 1.25), 0, Color.orange)); 
      g2.fillRect(start.x, start.y, end.x + end.width - start.x, start.height); 
     } 
     super.paintComponent(g); 
    } 
} 
+0

先生,當我點擊按鈕時,桌子上出現象牙背景。對於那件事我沒有任何疑問。但在點擊之前,桌子應該出現的部分仍然是灰色的。先生,也許這個問題是由於不同的面板造成的? – Gomathi 2012-07-23 06:57:11