2013-08-01 33 views
0

我已經徹底搜索(我認爲)瞭解我的問題的答案。我是初學者,所以我可能只是不知道要尋找什麼。我正在嘗試對我使用Graphics2D和GeneralPath編寫的辦公室佈局(表格,椅子)進行概述,並使用每位主持人的姓名對JLabels進行編碼。 如果已經得到解答,我表示歉意,但我確實看過。 (注:圖形是超級簡單現在:表只是一個正方形和椅子都只是線)辦公室佈局示例。 JLabels不會顯示在JApplet中

公共類DemoReception擴展JApplet的{

@Override  
public void paint(Graphics g){ 
    //draws table 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setStroke(new BasicStroke(4.0f)); 
    g2.setColor(Color.BLACK); 

    int[] xPoints={150,700,700,150}; 
    int[] yPoints={250,250,550,550}; 
    GeneralPath path = new GeneralPath(GeneralPath.WIND_EVEN_ODD,xPoints.length); 

    path.moveTo(xPoints[0], yPoints[0]); 
    for (int i = 0; i < xPoints.length; i++) { 
     path.lineTo(xPoints[i], yPoints[i]); 
    } 
    path.closePath(); 
    g2.draw(path); 

    //draws chairs 
    g2.setColor(Color.RED); 
    path = new GeneralPath(GeneralPath.WIND_NON_ZERO); 
    path.moveTo(260,240);//Person1 
    path.lineTo(310,240); 

    path.moveTo(510,240);//Person2 
    path.lineTo(560,240); 

    path.moveTo(260,560);//Person3 
    path.lineTo(310,560); 

    path.moveTo(510,560);//Person4 
    path.lineTo(560,560); 
    path.closePath(); 
    g2.draw(path);        
    } 

這裏是主要的方法:

public static void main(String[] args) { 
    int labelwidth = 50; 
    int labelheight = 10; 

    JFrame testFrame = new JFrame("Test Layout"); 
    testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JApplet demo = new DemoReception(); 
    testFrame.setBackground(Color.white); 
    testFrame.getContentPane().add(demo); 
    testFrame.pack(); 
    testFrame.setMinimumSize(new Dimension(1000,710)); 
    testFrame.setSize(new Dimension(1000,710)); 

    JPanel testPanel = new JPanel(); 
    testPanel.setAlignmentX(0); 
    testPanel.setAlignmentY(0); 

    label1 = new JLabel("Person1"); 
    label2 = new JLabel("Person2"); 
    label3 = new JLabel("Person3"); 
    label4 = new JLabel("Person4"); 

    label1.setAlignmentX(260); 
    label1.setAlignmentY(235); 
    label1.setSize(labelwidth, labelheight); 
    label1.setVisible(true);   
    testPanel.add(label1); 

    label2.setAlignmentX(510); 
    label2.setAlignmentY(235); 
    label2.setSize(labelwidth, labelwidth); 
    label2.setVisible(true); 
    testPanel.add(label2); 

    label3.setAlignmentX(260); 
    label3.setAlignmentY(565); 
    label3.setSize(labelwidth, labelwidth); 
    label3.setVisible(true); 
    testPanel.add(label3); 

    label4.setAlignmentX(510); 
    label4.setAlignmentY(565); 
    label4.setSize(labelwidth, labelwidth); 
    label4.setVisible(true); 
    testPanel.add(label4); 

    testFrame.getContentPane().add(testPanel); 
    testFrame.setVisible(true); 
} 

當我運行它時,我得到的只是帶有圖形的JFrame,但JLabels不顯示。 任何幫助,將不勝感激。

+0

中列出的步驟操作您的繪圖方法是否需要調用super.paint(g)?在我的頭頂,看起來你的paint()覆蓋會繪製圖形,但它不會繪製其他任何東西。它不會自動完成覆蓋版本所做的其餘內容。你需要通過調用super.paint(g)來做到這一點。看看是否有效。 – ajb

+0

P.S.我見過其他的答案,建議覆蓋paintComponent()而不是paint()...對不起,我不知道你是否需要這裏。如果你這樣做,同樣適用 - 你必須使它調用super.paintComponent(g)。 – ajb

回答

1

JLabel不會出現在JAppletJFrame#pack已添加的所有標籤之前調用。其結果是,這些組件沒有經過驗證,所以不要出現

的解決方法是調用調用setVisible

testFrame.pack(); 
testFrame.setVisible(true); 

然而進一步的修改是必要的前法作爲小程序窗口就不會出現這樣做時。這是因爲語句

testFrame.getContentPane().add(testPanel); 

將導致JPaneltestPanel被移位在早些時候的發言

testFrame.getContentPane().add(demo); 

BorderLayout實現只能包含一個組件在CENTER位置。

要修復,請刪除testPanel,並將JLabel組件直接添加到JAppletdemo

另外補充

super.paint(g); 

paint方法,以確保JLabels被擺畫。


當然,paint不應該用於Swing中的自定義繪畫。而是使用paintComponent

作爲未來的練習,請務必使用基於JComponent的類替代paint功能,並覆蓋paintComponent。請記住調用super.paintComponent(g)。請按照Performing Custom Painting

+0

謝謝你的幫助! – mcabe0131