2011-08-31 31 views
2

我製成一個JComponent顯示指定顏色的一個矩形。 (沒有找到任何其他方式來實現這種效果)。問題是,它不像預期的那樣遵循JFrame.pack()和佈局管理器。如何讓我的JComponent符合JFrame.pack和佈局管理器?

代碼:

import java.awt.*; 
import javax.swing.*; 

public class FooRunnable implements Runnable{ 

private class ColorSample extends JComponent{ 

    private Color sampleColor; 
    private int width, height; 

    public ColorSample(int rgb, int w, int h){ 
     sampleColor = new Color(rgb); 
     width = w; 
     height = h; 
    } 

    public Dimension getSize(){ 
     return new Dimension(width, height); 
    } 

    public int getWidth(){ 
     return width; 
    } 

    public int getHeight(){ 
     return height; 
    } 

    public boolean isDisplayable(){ 
     return true; 
    } 

    public void paintComponent(Graphics g){ 
     g.setColor(sampleColor); 
     g.fillRect(0, 0, width, height); 
    } 

} 

public void run(){ 
    JFrame mainFrame = new JFrame(); 
    //mainFrame.setSize(500, 300); 
    Container mainContent = mainFrame.getContentPane(); 
    mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    mainContent.setLayout(new BoxLayout(mainContent, BoxLayout.PAGE_AXIS)); 

    JPanel specifyFilePanel = new JPanel(); 
    specifyFilePanel.setLayout(new BoxLayout(specifyFilePanel, BoxLayout.LINE_AXIS)); 
    JLabel filenameLabel = new JLabel("File:  "); 
    JButton browseButton = new JButton("Browse..."); 
    specifyFilePanel.add(Box.createHorizontalStrut(8)); 
    specifyFilePanel.add(filenameLabel); 
    specifyFilePanel.add(browseButton); 
    specifyFilePanel.add(Box.createHorizontalStrut(8)); 

    JPanel colorStatusPanel = new JPanel(); 
    colorStatusPanel.setLayout(new BoxLayout(colorStatusPanel, BoxLayout.Y_AXIS)); 
    JLabel statusLabel = new JLabel(""); 
    JButton roll = new JButton("Operate"); 
    colorStatusPanel.add(new ColorSample(Color.red.getRGB(), 50, 100)); 
    colorStatusPanel.add(statusLabel); 
    colorStatusPanel.add(roll); 

    mainContent.add(Box.createVerticalStrut(5)); 
    mainContent.add(specifyFilePanel); 
    mainContent.add(Box.createVerticalStrut(10)); 
    mainContent.add(colorStatusPanel); 
    mainContent.add(new JPanel()); 
    mainFrame.pack(); 
    mainFrame.setVisible(true); 
} 

} 

我試着包間試驗和明確指定幀的大小。這裏是我的GUI的各種設置的默認外觀:

平原mainFrame.pack(): mainFrame.pack()

mainFrame.setSize(500,500): enter image description here

mainFrame.setSize(500, 300): mainFrame.setSize(500, 300)

最接近我打算實現的是mainFrame.setSize(500,500),但是,因爲我打算添加更多的組件,我預計它會變得脆弱。正如你所看到的,在另外兩個中,「操作」按鈕與ColorSample組件重疊 - 就像它沒有跟隨我設置的佈局管理器一樣。然後查看ColorSample組件的組裝方式。關於如何達到我想要的效果的任何提示?

+1

解決方法:有關使用空'JLabel',它的大小設置爲所需的一個,然後調用'的setBackground(彩色)'什麼? – Rom1

+0

哇。老實說,沒有想到這一點。只有ColorSample將來不得不改變形狀 - 我實際上是在製作一些像孩子的幼兒園軟件。但我會記住這一點。 :d – skytreader

回答

4

佈局管理可自由尺寸/位置的部件,他們認爲合適的,組件不能強迫他們,但只給提示在其getXXSize(XX ==分鐘/ PREF /最大值)的方法。所以最好的一個組件實現能做的就是

  • 實現所有getXXSize並返回規模,他們非常希望
  • 實施的paintComponent,以應付不同的尺寸

片段只

public class MyBox extends JComponent { 
    Dimension boxSize; 

    public void setBoxSize(Dimension box) { 
     this.boxSize = new Dimension(box); 
     ... 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     // position the box in the actual size 
     // and paint it 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return getBoxSize(); 
    } 
    @Override // same for min/max 
    public Dimension getM...Size({ 
     return getBoxSize(); 
    } 
} 
+0

+1表示完成。 – trashgod

+0

感謝代碼片段的努力。 :d – skytreader

4

pack()使用您的組件的getPreferredSize()。所以,只需返回您的矩形所需的大小,並將在LayoutManager中使用大小。

+0

織補..毆打,併爲簡潔,以便更短:-) – kleopatra

+0

+1。 – trashgod