2012-07-23 3 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

+0

@Robin 이것은 별도의 메소드 'addTable'입니다. actionPerformed에서 호출되어야합니다. 여기 없으면 어디에 붙여야합니까? – Gomathi

+0

EDT를 막지 않도록 데이터베이스 쿼리를 작업자 스레드에서 수행해야합니다. 예를 들어,'SwingWorker' 클래스를 사용할 수 있습니다. – Robin

답변

5

스크롤 창] 뷰포트로 알려진 또 다른 구성 요소가 포함되어 있습니다. 실제로 스크롤 영역에 할당 된 구성 요소가 추가됩니다. 당신이 (table1.setOpaque(false);) 투명, 다음

scroll1.getViewport().setBackground(ivory); 

그렇지 않으면 뷰 포트 배경을 변경해야으로의 JTable을 유지하려면

은 전체를 채우기 위해 테이블을 강제로 불투명 table1.setFillsViewportHeight(true);에 테이블을 설정 나

,174에 대한 뷰포트

업데이트]

작품 잘

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

+0

@Gomathi 내 업데이트를 확인하십시오. 나는 테스트 해 봤는데 잘 해냈다. – MadProgrammer

+0

@Gomathi가 mKorbel에게 댓글을 달았다. 프레임 내용을 배경으로 설정하기 전에 테이블을 만들고 코드에서 'panel1'도 배경을 가져야한다고 생각한다. 테이블을 만들기 전에 설정하십시오 – MadProgrammer

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