2012-05-22 81 views
0

我遇到了一個問題,如果我在包含JFrame的代碼的同一個java文件中使用main方法,該文件包含JTable,並且在其中將標題顏色設置爲黃色,運行它,標題將變成黃色。但是,如果我通過從其他類調用JFRame來實例化該標題,標題將不會是黃色,而是默認顏色。有沒有什麼方法可以確保顏色保持不變,即使我從其他類實例化JFrame並從而實現JTable?非常感謝!如果我沒有解釋清楚,我會很樂意澄清事情。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的實例,將在它顯示了JTable中的TabbedPane。然而,我使用自己的主要方法運行EquityFrame所獲得的GUI與從另一個代碼中創建實例所獲得的GUI不同。如果我使用自己的主要方法運行它,表格的標題中將會有顏色變化。但是,如果我從另一個java類運行它,顏色仍然是默認值。

如果我運行使用的主要方法是: http://tinypic.com/r/2r5yjdj/6

如果我使用其他類調用構造函數生成JFrame中運行它: http://tinypic.com/r/3523yax/6

再次感謝爲其提供任何幫助!希望這能更清楚地解釋我的問題。

+2

爲更好的幫助,儘早發佈一個[SSCCE](http://sscce.org/)展示您的問題的問題 – mKorbel

回答

3

確定在構建任何依賴新值之前更改UI屬性,最好在開始event dispatch thread之前更改。

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

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

或者,也可以是能夠適應在該方法中applyUI()所示here的方法;它可以在構造函數中調用,如圖所示,或者當系統調用updateUI()時。

附錄:您的第一個image顯示外觀&感覺支持TableHeader.background UI屬性。第二個image似乎是Nimbus L & F,其中does not支持該屬性。

+0

嗨,我已經添加了更多的解釋。希望這可以幫助你理解問題。非常感謝! – Laughy

+0

我已經闡述過了。 – trashgod

1

是在您的主要方法的定義中設置顏色的代碼?如果是這樣,請將其放入JFrame或JTable的構造函數中。

+0

即使[更早]我會這樣做(http://stackoverflow.com/a/10704257/ 230513)。 – trashgod

+1

@trashgod - 只要執行此操作的代碼位於自定義的JTable子類(如果存在)或自定義的JFrame子類「包裝器」(如果正在使用)中,就是非常正確的。我猜測OP對類和子類的「界限」並不清楚,並且沒有意識到主要方法只在Java啓動時或者被特定調用時才運行,並且子類的代碼僅限於其大括號之間的內容。但OP可能會有其他問題。 –

+0

嗨,我添加了更多的解釋。希望這可以幫助你理解問題。非常感謝! – Laughy