我正在尝试打开一个同时包含image
和buttons
的窗口。但我似乎无法弄清楚如何添加按钮。图像显示效果很好,菜单工作正常,但无论我在哪里添加按钮(进入JLabel
,JPanel
或JFrame
),都无法显示...
主要
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 :(得分:5)
您的主要问题是将contentPane设置为JLabel - 请勿执行此操作! contentPane需要是不透明的,需要构建为容易用作Container,在你的情况下,真的应该是JPanel。 JLabel我相信使用null布局,所以你的代码没有按钮就不足为奇了。如果要显示背景图像,请使用扩展JPanel的匿名类构造myPanel,覆盖此类中的paintComponent方法(在方法中首先调用super.paintComonent),然后在此方法中绘制图像。然后,您可以向contentPane添加组件,现在将使用FlowLayout(JPanel的默认值),默认情况下它将是不透明的。
此外,如果您的目标是交换GUI中显示的项目,请使用CardLayout为您进行交换,因为此布局使交换组件变得轻而易举。
答案 1 :(得分:4)
真的不知道,取决于方法如何将图片添加到JLabel, JPanel, or JFrame
,但也许对于包含少数的simle Container,只有一两个JComponents有疯狂的想法,没有一面效果,有想法显示图片,并添加JButton:
JLabel与JComponent非常相似JPanel,默认情况下是半透明且非常简单的实现Icon/ImageIcon,那么您只需要调用myLabel.setIcon(myPicture)
}
通过使用LayoutManager(Box,Flow,GridBagLayout)中的一些,您可以/可以添加另一个JComponent的所有JComponents
答案 2 :(得分:4)
您尝试将标签设置为内容窗格,然后尝试将该面板添加到该图像中,而该图像根本不会显示。
更改它,以便将标签添加到面板并将面板作为内容窗格:
像这样:
答案 3 :(得分:3)
你有这条线就是问题所在。它没有多大意义:
myFrame.setContentPane(myLabel);
尝试改为:
myFrame.getContentPane().add(myLabel);