2016-11-19 16 views
2

У меня есть JTable в моей программе, и я хотел изменить цвет JTableHeader. Я сделал это с помощью следующего кодаНастройка цвета JTableHeader цвет фона

JTableHeader header = table.getTableHeader(); 
header.setBackground(Color.WHITE); 

Однако, когда я тащил голову, я заметил, что там было серая область позади заголовка, как показано на фото ниже.

enter image description here

Как я могу установить это белый, так что она вписывается в мой JTableHeader?

MCVE

import java.awt.Color; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.JTableHeader; 
import javax.swing.SwingUtilities; 

@SuppressWarnings("serial") 
public class JTableTest extends JFrame { 
    private JTableTest() { 
     super("JTable Test"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(new GridLayout(1, 1)); 
     createPanel(); 
     pack(); 
     setVisible(true); 
    } 

    JPanel panel = new JPanel(new GridLayout(1, 1)); 
    JScrollPane scroll = new JScrollPane(); 

    private void createPanel() { 
     Object[] headers = {"Select", "Title", "Artist", "Length"}; 
     Object[][] sampleData = {{true, "Bat Outta Hell", "Meat Loaf", "673"}, 
       {false, "Spanish Train", "Chris De Burgh", "358"}}; 
     JTable table = new JTable(sampleData, headers); 
     /// 
     JTableHeader header = table.getTableHeader(); 
     header.setBackground(Color.WHITE); //Sets header white 
     /// 
     scroll.getViewport().add(table); 
     scroll.getViewport().setBackground(Color.WHITE); //Sets table container white 
     panel.add(scroll); 
     panel.setBackground(Color.WHITE); //Sets scroll pane container white 
     getContentPane().add(panel); 
     getContentPane().setBackground(Color.WHITE); //Sets panel container white 
     //What should be set to white to make header container white 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater (
      new Runnable() { 
       @Override 
       public void run() { 
        new JTableTest(); 
       } 
      } 
     ); 
    } 
} 
+0

Отъезд: http://stackoverflow.com/questions/40651526/jscrollpane-prevents-components-shrinking-below-their-preferred-size – camickr

+0

@camickr Я Мне жаль, что я не совсем уверен, что ответы на этот вопрос обсуждаются. Вы имеете в виду 'jsp.getViewport(). SetBackground (Color.WHITE);' потому что это не имело никакого отношения к этой части? Или вы имеете в виду 'ScrollablePanel'? – Dan

+0

@camickr Извините, я прочитал его, и обычно я оставляю комментарий (просто не в этот раз) – Dan

ответ

3

Ну, как я ожидал, мы должны установить родительский заголовок, чтобы иметь цвет фона вы хотите.

Однако панель прокрутки НЕ является родительским элементом заголовка, как я ожидал.

Когда я добавил код вроде следующего:

System.out.println(header.getParent()); 

он показал JViewport как родитель, который меня смутил.

Однако, когда я добавил:

System.out.println(scroll.getViewport()); 

Я заметил, что два видовых были разными. Таким образом, окно просмотра scrollpane отличается от области просмотра заголовка.

поэтому решение проблемы:

JTableHeader header = table.getTableHeader(); 
header.setBackground(Color.GREEN); 

, а затем ПОСЛЕ кадр виден вы можете сделать:

header.getParent().setBackground(Color.YELLOW); 

(я использовал различные цвета, чтобы показать эффекты каждое заявление)

Обратите внимание, что заголовок не добавляется в прокрутку, пока рамка не упакована или не станет видимой. Если вы попытаетесь установить фон при создании таблицы, вы получите NPE при попытке доступа к родительскому элементу.

Или еще один вариант - добавить AncestorListener в JTableHeader. Затем код можно вызвать, затем заголовок будет добавлен в видимый кадр. Для этого типа подхода ознакомьтесь Request Focus Listener найти в Dialog Focus

+1

Спасибо. Я просто получил это, чтобы работать. Я добавил «MouseAdapter» в заголовок, так как первый клик по нему опустился, он установил цвет. Есть ли лучший способ сделать это, когда я создал фрейм, а затем сделал JTable после того, как был виден кадр. Я все еще получил NPE. (Возможно, что-то не так, а просто проверка) – Dan

+2

'Есть ли лучший способ? - Я уже дал вам один (используя AncestorListener), поэтому код выполняется только один раз. Также недостаточно создать JTable. Стол должен быть добавлен в scrollpane. – camickr

+0

Спасибо вам за помощь. Я ценю это – Dan