Изменить цвет фона 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();
}

Вывод


person Gomathi    schedule 23.07.2012    source источник
comment
Совершенно не связано... избегайте запросов к базе данных в потоке отправки событий. Дополнительную информацию см. в разделе Параллелизм в Swing.   -  person Robin    schedule 23.07.2012
comment
@Robin Это отдельный метод addTable. Он должен вызываться в actionPerformed. Если не здесь, то куда мне его положить, сэр?   -  person Gomathi    schedule 23.07.2012
comment
Запрос к базе данных должен выполняться в рабочем потоке, чтобы избежать блокировки EDT. Например, для этого можно использовать класс SwingWorker.   -  person Robin    schedule 23.07.2012


Ответы (2)


Панели прокрутки содержат еще один компонент, известный как ViewPort. Именно здесь добавляются компоненты, назначенные панели прокрутки.

Если вы хотите, чтобы 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);

Вы можете закомментировать раздел создания строки, и он все равно будет окрашен в цвет слоновой кости.

person MadProgrammer    schedule 23.07.2012
comment
Как вы видели, я уже использовал ваш первый вариант в программе. Но это не сработало. Теперь я сделал таблицу непрозрачной и заполнил окно просмотра. Но все же это не работает, сэр. - person Gomathi; 23.07.2012
comment
@Gomathi Проверьте мое обновление. Я проверял, и у меня все работает отлично - person MadProgrammer; 23.07.2012
comment
@Gomathi из вашего комментария mKorbel, убедитесь, что фон панели содержимого фреймов также установлен ДО того, как вы создадите таблицу, и из вашего кода я думаю, что фон panel1 также должен быть установлен ДО создания таблицы. - person MadProgrammer; 23.07.2012
comment
Почему используется этот вектор, сэр? Будет ли кодирование работать только в том случае, если я его использовал, сэр? - person Gomathi; 23.07.2012
comment
Вектор используется, потому что у меня нет доступа к вашей базе данных и мне нужно видеть результаты таблицы, когда она была заполнена, а также заполнена. Вам это не нужно, это не повлияет на результат. В моем примере сохраняется непрозрачность (true) и используется свойство fillsViewportHeight - person MadProgrammer; 23.07.2012
comment
Большое спасибо, сэр. Это работало нормально, когда я устанавливал фон панели содержимого и фон панели ДО создания таблицы. Большое спасибо, сэр. - person Gomathi; 23.07.2012

почему не работает???

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);
    }
}
person mKorbel    schedule 23.07.2012
comment
Сэр, когда я нажимаю кнопку, появляется таблица с фоном цвета слоновой кости. У меня нет проблем с этим. Но перед тем, как щелкнуть, часть, где должна появиться таблица, остается серой. Может проблема в разных панелях, сэр? - person Gomathi; 23.07.2012