2010-05-29 39 views
3

为什么我的JFrame的“框架”是空的窗口,当它应该给我3个菜单按钮和我自己绘制的JComponent?我在这里错过了什么?如何在框架中显示具有组件的面板

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

public class Eyes extends JFrame { 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("Eyes"); 
     frame.setPreferredSize(new Dimension(450, 300)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel players = new JPanel(new GridLayout(1, 3)); 
       players.add(new JButton("Eyes color")); 
       players.add(new JButton("Eye pupil")); 
       players.add(new JButton("Background color")); 

     JPanel eyes = new JPanel(); 
     eyes.add(new MyComponent()); 

     JPanel content = new JPanel(); 
     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 
     content.add(players); 
     content.add(eyes); 

     frame.getContentPane(); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

class MyComponent extends JComponent { 

    public MyComponent(){ 

    } 

    @Override 
    public void paint(Graphics g) { 
     int height = 120; 
     int width = 120; 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
     BasicStroke bs = new BasicStroke(3.0f); 
     g2d.setStroke(bs); 
     g2d.setColor(Color.yellow); 
     g2d.fillOval(200, 200, height, width); 
     g2d.setColor(Color.black); 
     g2d.drawOval(60, 60, height, width); 
    } 
} 
+1

自定义绘画应通过覆盖paintComponent()方法而不是paint()方法来完成。你应该调用super.paintComponent()作为该方法的第一条语句。 – camickr 2010-05-29 05:12:30

回答

2

你行:

frame.getContentPane(); 

没有做任何事情,但访问框架的内容窗格。相反,获取内容窗格,您应该设置内容窗格中,像这样:

frame.setContentPane(content); 

编辑:

此外,作为@trashgod指出,你可以使用getContentPane方法来访问默认内容窗格和你content组件添加到:

frame.getContentPane().add(content); 
+0

+1另外,'frame.add(content)'通过转发。 – trashgod 2010-05-29 02:04:36

0

我认为你正在尝试使用嵌套JPanels。这当然是组织你的组件的一种方式,但缺点是在某些情况下难以管理。你可以尝试下面的代码片段。在程序中,你会发现:

1)的JLabel

2)的嵌套JTextField

3)JPanels

阵列在节目结束的数组我使用Container到将这些对象的最终产品添加到我的图形窗口中。

我能想到的最有效的方法是在我的程序的顶部定义这些组件,以便我可以在需要时再使用它们。

要做到这一点,你可以试试这个代码片段:

import javax.swing.*; //Required to use Swing Components 

public class TestGUI extends JFrame 
{ 
    JLabel[] label;   //Define this with an array 
    JTextField[] textField; //Define this with an array as well 

    private int nLabels;  //Number of labels preferred 
    private int nTextFields; //Number of text fields preferred 

    public testGUI(int amt) 
    { 
     //Assuming that you want equal amounts of each, 
     //set these two variables to the "ant" input parameter 
     nLabels  = amt; 
     nTextFields = amt; 

     //Set component attributes 
     label  = new JLabel[2];  //Label compared text fields 
     textField = new JTextField[2]; //Use two of these for comparison 

     textField[0].setEnabled(false); //Disabled editing 
     //Do nothing with the second text field 

     JPanel labels = new JPanel(); //Place JLabels here 

     //Use this to align the labels vertically 
     labels.setLayout(new GridLayout(2, 1)); 

     //Use this for loop to add the labels to this JPanel 
     for(int i = 0; i < nLabels; i++) 
     { 
      labels.add(label[i]); 
      //You can also define and apply additional properties 
      //to labels inside this loop. TIP: You can do this in 
      //any loop 
     } 

     JPanel txtFields = new JPanel(); //Place JTextFields here 

     //Use this to align the text fields vertically 
     txtFields.setLayout(new GridLayout(2, 1)); 

     //Use this for loop to add the labels to this JPanel 
     for(int i = 0; i < nTextFields; i++) 
     { 
      textFields.add(textField[i]); 
      //You can also define and apply additional properties 
      //to text fields inside this loop. TIP: You can do 
      //this in any loop 
     } 

     //Now we have the two components, you asked for help with, set up 
     //Next, we will need another JPanel to add these to panels to. 
     //This JPanel will be added to the JFrame Container 
     //You probably know how to run this via the "main" method 

     JPanel window = new JPanel(); 
     //Place the JPanel for the labels and text fields 

     //This requires a horizontal grid 
     window.setLayout(new GridLayout(1, 2)); 

     //Add the the two JPanels: "labels" and "txtFields" 
     window.add(labels); 
     window.add(txtFields); 

     //Define the Container object to set up the GUI 
     Container container = getContentPane(); 

     //Apply the "window" JPanel object to the container 
     container.add(window, BorderLayout.CENTER); 
     //Center this in the Graphics Window when displayed 
    } 
    //Any other methods and/or functions can be added as well 
    //If they are, they must placed in the constructor method above 
} 

这是试图去在制造和操纵我的图形窗口,我写的时候,我会使用的方法。有时候我会写小程序,但只有在确保我在一个简单的图形窗口中才能正常运行后。

我希望这会有所帮助。

如果您有任何其他问题,请让我知道,我会尽我所能回答,谢谢。