2011-09-18 189 views
2

我试图打开同时具有image和它buttons一个窗口。但我似乎无法弄清楚如何添加按钮。图像显示大和菜单工作正常,但不管我在哪里添加按钮(进入JLabelJPanel,或JFrame),它不会永远显示...的Java GUI - JPanels,JFrames,Jbutton将

主营:

public static void main(String[] args) { 
    GUI myGUI = new GUI(); 
    myGUI.show(); 
} 

GUI类: openImage使用菜单时调用。然后图像显示,但没有按钮。

private JFrame myFrame; 
private JPanel myPanel; 
private JLabel myLabel; 
public GUI() 
{ 
    myFrame = new JFrame(); 
    initializePanel(); 
} 

public void show() 
{ 
    myFrame.setSize(600,600); 
    myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    myFrame.addMouseListener(this); 

    setupMenu(myFrame);  

    myFrame.setVisible(true); 
} 
private void initializePanel() 
{ 
     myPanel = new JPanel(); 
     myPanel.setPreferredSize(new Dimension(500,500)); 
     //myPanel.setLayout(new BorderLayout()); 
} 
private void openImage(String fileName) 
{ 
    try { 
     myImage = ImageIO.read(new File(fileName)); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }  

    myLabel = getJLabel(); 

    JButton button = new JButton("ButtonClick"); 
     button.addActionListener(this); 

    myFrame.setContentPane(myLabel); 

    myPanel.add(button); 
    myFrame.getContentPane().add(myPanel); 

    myFrame.pack(); 
    myFrame.setSize(600,600); 
} 
private void setupMenu(JFrame window) { 
     JMenuBar menubar = new JMenuBar(); 
     JMenu file = new JMenu("File"); 
     JMenuItem open = new JMenuItem("Open"); 
     open.addActionListener(this); 
     file.add(open); 
     menubar.add(file); 
     window.setJMenuBar(menubar); 
} 
+0

'myFrame.setSize(600600);'是多余的。 'pack()'方法将帧设置得足够大,以保持帧内每个组件的首选大小(但不会更大)。另外,'setupMenu()'方法在哪里?这可能是一个促成因素。 – fireshadow52

+0

@ fireshadow52 - 感谢您的回复。如果我在'myFrame.pack()'之后取出'myFrame.setSize(600,600)',则它只能调整为图像尺寸。我还在我的帖子中添加了'setupMenu'方法。 – RedLeader

+0

我想你应该切换'myPanel.add(button)'和'button.addActionListener(this);'语句。如果不这样做,请检查你的代码,看看你是否有任何可能会弄乱它的行或语句。 – fireshadow52

回答

5

你的主要问题是你设置的contentPane是一个JLabel - 不要这样做! contentPane需要是不透明的,需要被构建为容易使用的容器,在你的情况下,真的应该是一个JPanel。 JLabel我相信使用空布局,所以你的代码没有显示任何按钮就不足为奇了。如果你想显示背景图像,使之具有从延伸到JPanel的一个匿名类构造myPanel,覆盖在这个类(调用super.paintComonent先在法)的paintComponent方法,并在此方法绘制图像。然后,您可以将组件添加到contentPane,该组件现在将使用FlowLayout(默认用于JPanel),默认情况下它将不透明。

另外,如果你的目标是在交换你的GUI显示的项目,使用CardLayout做交换你作为这个布局使得交换组件变得轻而易举。

+0

谢谢,那是我绝对错过的。我将myLabel和按钮添加到myPanel,并将contentPane设置为myPanel。现在它按需要工作。 – RedLeader

+0

最复杂的答案我的+1 – mKorbel

4

真的不知道,取决于方法如何将图片添加到JLabel, JPanel, or JFrame,但也许对于simle容器包含一些,只有一两个JComponents是否有疯狂的想法,没有副作用,主意显示图片,并添加有一个JButton:

JLabel非常similair JComponentJPanel,并且默认是半透明的,很简单的工具Icon/ImageIcon,那么你就只能调用myLabel.setIcon(myPicture)

到所有的JComponents你/可以通过使用中的一些添加另一个JComponent(盒,流量的GridBagLayout)

3

您有这行就是问题所在。它没有多大意义:

myFrame.setContentPane(myLabel); 

尝试,而不是:

myFrame.getContentPane().add(myLabel); 
4

您试图设置标签的内容窗格,然后试图将面板添加到图像不使根本不用担心。

变化,所以你的标签添加到面板上,并有面板内容窗格:

像这样:

evidence

+0

我几乎要求一个代码示例,但它在image_中! :-) – trashgod

+0

@trashgod哦,是的,它是;) – OscarRyz

+0

太f ***'n很酷。 1+ –