Java GUI - JPanels, JFrames, JButtons - PullRequest
       24

Java GUI - JPanels, JFrames, JButtons

2 голосов
/ 19 сентября 2011

Я пытаюсь открыть окно, в котором есть image и buttons. Но я не могу понять, как добавить кнопку. Изображение отображается отлично, и меню работает нормально, но независимо от того, куда я добавляю кнопку (в JLabel, JPanel или JFrame), она никогда не отображается ...

Main:

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);
}

Ответы [ 4 ]

5 голосов
/ 19 сентября 2011

Ваша главная проблема - это , устанавливающий область содержимого для JLabel - не делайте этого! ContentPane должен быть непрозрачным, должен быть собран, чтобы его можно было легко использовать в качестве контейнера, и в вашем случае он действительно должен быть JPanel. Я полагаю, что JLabel использует пустой макет, поэтому неудивительно, что в вашем коде нет кнопки. Если вы хотите показать фоновое изображение, сделайте myPanel построенным из анонимного класса, расширяющего JPanel, переопределите метод paintComponent в этом классе (сначала вызывая super.paintComonent в методе) и нарисуйте изображение в этом методе. Затем вы можете добавить компоненты в contentPane, которые теперь будут использовать FlowLayout (по умолчанию для JPanel), и он будет непрозрачным по умолчанию.

Кроме того, если ваша цель - поменять местами элементы, отображаемые в вашем графическом интерфейсе, используйте CardLayout, чтобы выполнить замену за вас, так как этот макет упрощает замену компонентов.

4 голосов
/ 19 сентября 2011

Вы попытались установить метку в качестве панели содержимого, а затем попытались добавить панель к этому изображению, которая вообще не делает sanse.

Измените ее, чтобы добавить метку на панель и получитьпанель как панель содержимого:

Как это:

evidence

4 голосов
/ 19 сентября 2011

действительно не знаю, зависит от метода (ов), как вы добавляете картинку в JLabel, JPanel, or JFrame, но, возможно, для простого Контейнера, который содержит несколько, только один-два JComponents, есть сумасшедшая идея, без побочных эффектов, с идеей отобразить картинку и добавить туда JButton:

JLabel очень похож на JComponent на JPanel и по умолчанию является полупрозрачным и очень простым реализует Icon / ImageIcon , затем вам нужно будет только позвонить myLabel.setIcon(myPicture)

ко всем JComponent вы можете / могли бы добавить еще один JComponent, используя некоторые из LayoutManager (Box, Flow, GridBagLayout)

3 голосов
/ 19 сентября 2011

У вас есть эта строка, которая является проблемой.Это не имеет особого смысла:

myFrame.setContentPane(myLabel);

Попробуйте вместо:

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