Другой цвет в заголовке JTable

Я столкнулся с проблемой, когда, если я использую основной метод в том же java-файле, который содержит код для JFrame, который содержит JTable, и где я устанавливаю желтый цвет заголовка, когда я его запускаю, заголовок будет желтым. Однако, если я создам экземпляр JFRame, вызвав его из других классов, заголовок не будет желтым, а вместо этого будет цветом по умолчанию. Есть ли способ убедиться, что цвет остается прежним, даже если я создаю экземпляр JFrame и, следовательно, JTable из других классов? Большое спасибо! Я буду рад прояснить вещи, если я не объяснил ясно.

Привет, я прошу прощения за то, что не предоставил код заранее. Вот :

EquityFrame eq= new EquityFrame(file,"Apr2012");
this.dispose();// this code is in another class of a JFrame which will call the constructor of EquityFrame class

Код класса EquityFrame

    public EquityFrame(File file, String nameTab){
    createAndShowGUI( file,  nameTab);
}

    private  void createAndShowGUI(File file, String nameTab){
    //create frame

    JTabbedPane  tabPane= new JTabbedPane();
    //pre-processing
    init(file,nameTab);
    //adding tabs
    tabPane.addTab("Proposal", makeAdminPanel());
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame jf= new JFrame("CGH Equity Program");
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setLayout(new BorderLayout());
    jf.add(tabPane,BorderLayout.CENTER);
    int w = Toolkit.getDefaultToolkit().getScreenSize().width;
    int h = Toolkit.getDefaultToolkit().getScreenSize().height;
    jf.setSize(w, h);
    jf.setVisible(true);
}
private JPanel makeAdminPanel(){
    JPanel jp=new JPanel();
    String[] column = {"Job Grade", "Job Title", "Min", "Midpoint", "Max", 
        "Lowest", "P10", "P25", "Median", "P65", "P75", "P90", 
        "Highest", "Average"};
    String[][] data= getArrayOfValuesForEachJobGrade();
    jp.setLayout(new BorderLayout());
    JTable jt= new JTable(data,column);
    JTableHeader th=jt.getTableHeader();
    th.setBackground(java.awt.Color.pink);
    th.setEnabled(false);
    jt.setTableHeader(th);
    jt.setEnabled(false);
    jp.add(jt,BorderLayout.CENTER);
    JScrollPane scrollPane = new JScrollPane(jt, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    scrollPane.setEnabled(false);
    jp.add(scrollPane, BorderLayout.CENTER);
    return jp;
}

Сначала я запущу первый java-файл, который создаст экземпляр EquityFrame, который будет отображать tabbedPane с JTable в нем. Однако графический интерфейс, который я получаю при запуске EquityFrame с его собственным основным методом, отличается от графического интерфейса, который я получаю при создании его экземпляра в другом коде. Если я запущу его, используя его собственный основной метод, в заголовке таблицы изменится цвет. Однако цвет остается по умолчанию, если я запускаю его из другого класса Java.

Если я запускаю его, используя основной метод: http://tinypic.com/r/2r5yjdj/6

Если я запускаю его, используя другой класс, чтобы вызвать его конструктор для создания JFrame: http://tinypic.com/r/3523yax/6

Еще раз спасибо за любую оказанную помощь! Надеюсь, что это проливает больше света на мою проблему.


person Laughy    schedule 22.05.2012    source источник
comment
для получения более подробной помощи, скорее опубликуйте SSCCE продемонстрированные проблемы из вашего вопроса   -  person mKorbel    schedule 22.05.2012


Ответы (2)


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

UIManager.put("TableHeader.background", Color.yellow);
EventQueue.invokeLater(new Runnable() {

    @Override
    public void run() {
        new Application();
    }
});

В качестве альтернативы вы можете адаптировать подход, показанный здесь в методе applyUI(); его можно вызвать в конструкторе, как показано, или когда система вызывает updateUI().

Приложение. Ваше первое изображение показывает внешний вид, который поддерживает свойство TableHeader.background пользовательского интерфейса. . Второе изображение похоже на Nimbus L&F, которое не поддерживает это свойство.

person trashgod    schedule 22.05.2012
comment
Привет, я добавил больше объяснений. Надеюсь, это поможет вам в понимании проблемы. Большое спасибо! - person Laughy; 23.05.2012

Является ли код, который устанавливает цвет в определении вашего основного метода? Если это так, поместите его в конструкторы для JFrame или JTable.

person Phil Freihofner    schedule 22.05.2012
comment
@trashgod - Вы совершенно правы, если код, который это делает, находится в пользовательском подклассе JTable (если таковой существует) или в пользовательской оболочке подкласса JFrame (если таковая используется). Я предполагаю, что OP неясно относится к границам классов и подклассов и не понимает, что основной метод запускается только при запуске Java или при специальном вызове, и что код для подкласса ограничен тем, что находится между его фигурными скобками. Но у ОП могут быть другие проблемы. - person Phil Freihofner; 22.05.2012
comment
Привет, я добавил больше объяснений. Надеюсь, это поможет вам в понимании проблемы. Большое спасибо! - person Laughy; 23.05.2012
comment
Может быть, следующим шагом будет удаление из кода всего, что не влияет на проблему, — сделайте простейший пример и покажите, как вы вызываете этот класс? Пока ответа не вижу. - person Phil Freihofner; 23.05.2012